Methods of constructing simplicial sets#
This implements various constructions on simplicial sets: subsimplicial sets, pullbacks, products, pushouts, quotients, wedges, disjoint unions, smash products, cones, and suspensions. The best way to access these is with methods attached to simplicial sets themselves, as in the following.
EXAMPLES:
sage: K = simplicial_sets.Simplex(1)
sage: square = K.product(K)
sage: K = simplicial_sets.Simplex(1)
sage: endpoints = K.n_skeleton(0)
sage: circle = K.quotient(endpoints)
>>> from sage.all import *
>>> K = simplicial_sets.Simplex(Integer(1))
>>> square = K.product(K)
>>> K = simplicial_sets.Simplex(Integer(1))
>>> endpoints = K.n_skeleton(Integer(0))
>>> circle = K.quotient(endpoints)
The mapping cone of a morphism of simplicial sets is constructed as a pushout:
sage: eta = simplicial_sets.HopfMap()
sage: CP2 = eta.mapping_cone()
sage: type(CP2)
<class 'sage.topology.simplicial_set_constructions.PushoutOfSimplicialSets_finite_with_category'>
>>> from sage.all import *
>>> eta = simplicial_sets.HopfMap()
>>> CP2 = eta.mapping_cone()
>>> type(CP2)
<class 'sage.topology.simplicial_set_constructions.PushoutOfSimplicialSets_finite_with_category'>
See the main documentation for simplicial sets, as well as for the classes for pushouts, pullbacks, etc., for more details.
Many of the classes defined here inherit from
sage.structure.unique_representation.UniqueRepresentation
. This
means that they produce identical output if given the same input, so
for example, if K
is a simplicial set, calling K.suspension()
twice returns the same result both times:
sage: CP2.suspension() is CP2.suspension()
True
>>> from sage.all import *
>>> CP2.suspension() is CP2.suspension()
True
So on one hand, a command like simplicial_sets.Sphere(2)
constructs a distinct copy of a 2-sphere each time it is called; on
the other, once you have constructed a 2-sphere, then constructing its
cone, its suspension, its product with another simplicial set, etc.,
will give you the same result each time:
sage: simplicial_sets.Sphere(2) == simplicial_sets.Sphere(2)
False
sage: S2 = simplicial_sets.Sphere(2)
sage: S2.product(S2) == S2.product(S2)
True
sage: S2.disjoint_union(CP2, S2) == S2.disjoint_union(CP2, S2)
True
>>> from sage.all import *
>>> simplicial_sets.Sphere(Integer(2)) == simplicial_sets.Sphere(Integer(2))
False
>>> S2 = simplicial_sets.Sphere(Integer(2))
>>> S2.product(S2) == S2.product(S2)
True
>>> S2.disjoint_union(CP2, S2) == S2.disjoint_union(CP2, S2)
True
AUTHORS:
John H. Palmieri (2016-07)
- class sage.topology.simplicial_set_constructions.ConeOfSimplicialSet(base)[source]#
Bases:
SimplicialSet_arbitrary
,UniqueRepresentation
Return the unreduced cone on a finite simplicial set.
INPUT:
base
– return the cone on this simplicial set.
Add a point \(*\) (which will become the base point) and for each simplex \(\sigma\) in
base
, add both \(\sigma\) and a simplex made up of \(*\) and \(\sigma\) (topologically, form the join of \(*\) and \(\sigma\)).EXAMPLES:
sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet sage: v = AbstractSimplex(0, name='v') sage: e = AbstractSimplex(1, name='e') sage: X = SimplicialSet({e: (v, v)}) sage: CX = X.cone() # indirect doctest sage: CX.nondegenerate_simplices() [*, v, (v,*), e, (e,*)] sage: CX.base_point() *
>>> from sage.all import * >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet >>> v = AbstractSimplex(Integer(0), name='v') >>> e = AbstractSimplex(Integer(1), name='e') >>> X = SimplicialSet({e: (v, v)}) >>> CX = X.cone() # indirect doctest >>> CX.nondegenerate_simplices() [*, v, (v,*), e, (e,*)] >>> CX.base_point() *
- n_skeleton(n)[source]#
Return the \(n\)-skeleton of this simplicial set.
That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).
INPUT:
n
– the dimension
In the case when the cone is infinite, the \(n\)-skeleton of the cone is computed as the \(n\)-skeleton of the cone of the \(n\)-skeleton.
EXAMPLES:
sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: X = B.disjoint_union(B) sage: CX = B.cone() sage: CX.n_skeleton(3).homology() # needs sage.modules {0: 0, 1: 0, 2: 0, 3: Z}
>>> from sage.all import * >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> X = B.disjoint_union(B) >>> CX = B.cone() >>> CX.n_skeleton(Integer(3)).homology() # needs sage.modules {0: 0, 1: 0, 2: 0, 3: Z}
- class sage.topology.simplicial_set_constructions.ConeOfSimplicialSet_finite(base)[source]#
Bases:
ConeOfSimplicialSet
,SimplicialSet_finite
Return the unreduced cone on a finite simplicial set.
INPUT:
base
– return the cone on this simplicial set.
Add a point \(*\) (which will become the base point) and for each simplex \(\sigma\) in
base
, add both \(\sigma\) and a simplex made up of \(*\) and \(\sigma\) (topologically, form the join of \(*\) and \(\sigma\)).EXAMPLES:
sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet sage: v = AbstractSimplex(0, name='v') sage: e = AbstractSimplex(1, name='e') sage: X = SimplicialSet({e: (v, v)}) sage: CX = X.cone() # indirect doctest sage: CX.nondegenerate_simplices() [*, v, (v,*), e, (e,*)] sage: CX.base_point() *
>>> from sage.all import * >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet >>> v = AbstractSimplex(Integer(0), name='v') >>> e = AbstractSimplex(Integer(1), name='e') >>> X = SimplicialSet({e: (v, v)}) >>> CX = X.cone() # indirect doctest >>> CX.nondegenerate_simplices() [*, v, (v,*), e, (e,*)] >>> CX.base_point() *
- base_as_subset()[source]#
If this is the cone \(CX\) on \(X\), return \(X\) as a subsimplicial set.
EXAMPLES:
sage: # needs sage.groups sage: X = simplicial_sets.RealProjectiveSpace(4).unset_base_point() sage: Y = X.cone() sage: Y.base_as_subset() Simplicial set with 5 non-degenerate simplices sage: Y.base_as_subset() == X True
>>> from sage.all import * >>> # needs sage.groups >>> X = simplicial_sets.RealProjectiveSpace(Integer(4)).unset_base_point() >>> Y = X.cone() >>> Y.base_as_subset() Simplicial set with 5 non-degenerate simplices >>> Y.base_as_subset() == X True
- map_from_base()[source]#
If this is the cone \(CX\) on \(X\), return the inclusion map from \(X\).
EXAMPLES:
sage: X = simplicial_sets.Simplex(2).n_skeleton(1) sage: Y = X.cone() sage: Y.map_from_base() Simplicial set morphism: From: Simplicial set with 6 non-degenerate simplices To: Cone of Simplicial set with 6 non-degenerate simplices Defn: [(0,), (1,), (2,), (0, 1), (0, 2), (1, 2)] --> [(0,), (1,), (2,), (0, 1), (0, 2), (1, 2)]
>>> from sage.all import * >>> X = simplicial_sets.Simplex(Integer(2)).n_skeleton(Integer(1)) >>> Y = X.cone() >>> Y.map_from_base() Simplicial set morphism: From: Simplicial set with 6 non-degenerate simplices To: Cone of Simplicial set with 6 non-degenerate simplices Defn: [(0,), (1,), (2,), (0, 1), (0, 2), (1, 2)] --> [(0,), (1,), (2,), (0, 1), (0, 2), (1, 2)]
- class sage.topology.simplicial_set_constructions.DisjointUnionOfSimplicialSets(factors=None)[source]#
Bases:
PushoutOfSimplicialSets
,Factors
Return the disjoint union of simplicial sets.
INPUT:
factors
– a list or tuple of simplicial sets
Discard any factors which are empty and return the disjoint union of the remaining simplicial sets in
factors
. The disjoint union comes equipped with a map from each factor, as long as all of the factors are finite.EXAMPLES:
sage: CP2 = simplicial_sets.ComplexProjectiveSpace(2) sage: K = simplicial_sets.KleinBottle() sage: W = CP2.disjoint_union(K) sage: W.homology() # needs sage.modules {0: Z, 1: Z x C2, 2: Z, 3: 0, 4: Z} sage: W.inclusion_map(1) Simplicial set morphism: From: Klein bottle To: Disjoint union: (CP^2 u Klein bottle) Defn: [Delta_{0,0}, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}] --> [Delta_{0,0}, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}]
>>> from sage.all import * >>> CP2 = simplicial_sets.ComplexProjectiveSpace(Integer(2)) >>> K = simplicial_sets.KleinBottle() >>> W = CP2.disjoint_union(K) >>> W.homology() # needs sage.modules {0: Z, 1: Z x C2, 2: Z, 3: 0, 4: Z} >>> W.inclusion_map(Integer(1)) Simplicial set morphism: From: Klein bottle To: Disjoint union: (CP^2 u Klein bottle) Defn: [Delta_{0,0}, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}] --> [Delta_{0,0}, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}]
- n_skeleton(n)[source]#
Return the \(n\)-skeleton of this simplicial set.
That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).
INPUT:
n
– the dimension
The \(n\)-skeleton of the disjoint union is computed as the disjoint union of the \(n\)-skeleta of the component simplicial sets.
EXAMPLES:
sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: T = simplicial_sets.Torus() sage: X = B.disjoint_union(T) sage: X.n_skeleton(3).homology() # needs sage.modules {0: Z, 1: Z x Z x C2, 2: Z, 3: Z}
>>> from sage.all import * >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> T = simplicial_sets.Torus() >>> X = B.disjoint_union(T) >>> X.n_skeleton(Integer(3)).homology() # needs sage.modules {0: Z, 1: Z x Z x C2, 2: Z, 3: Z}
- summand(i)[source]#
Return the \(i\)-th factor of this construction of simplicial sets.
INPUT:
i
– integer, the index of the factor
EXAMPLES:
sage: S2 = simplicial_sets.Sphere(2) sage: S3 = simplicial_sets.Sphere(3) sage: K = S2.disjoint_union(S3) sage: K.factor(0) S^2 sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: X = B.wedge(S3, B) sage: X.factor(1) S^3 sage: X.factor(2) Classifying space of Multiplicative Abelian group isomorphic to C2
>>> from sage.all import * >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> K = S2.disjoint_union(S3) >>> K.factor(Integer(0)) S^2 >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> X = B.wedge(S3, B) >>> X.factor(Integer(1)) S^3 >>> X.factor(Integer(2)) Classifying space of Multiplicative Abelian group isomorphic to C2
- summands()[source]#
Return the factors involved in this construction of simplicial sets.
EXAMPLES:
sage: S2 = simplicial_sets.Sphere(2) sage: S3 = simplicial_sets.Sphere(3) sage: S2.wedge(S3).factors() == (S2, S3) True sage: S2.product(S3).factors()[0] S^2
>>> from sage.all import * >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> S2.wedge(S3).factors() == (S2, S3) True >>> S2.product(S3).factors()[Integer(0)] S^2
- class sage.topology.simplicial_set_constructions.DisjointUnionOfSimplicialSets_finite(factors=None)[source]#
Bases:
DisjointUnionOfSimplicialSets
,PushoutOfSimplicialSets_finite
The disjoint union of finite simplicial sets.
- inclusion_map(i)[source]#
Return the inclusion map of the \(i\)-th factor.
EXAMPLES:
sage: S1 = simplicial_sets.Sphere(1) sage: S2 = simplicial_sets.Sphere(2) sage: W = S1.disjoint_union(S2, S1) sage: W.inclusion_map(1) Simplicial set morphism: From: S^2 To: Disjoint union: (S^1 u S^2 u S^1) Defn: [v_0, sigma_2] --> [v_0, sigma_2] sage: W.inclusion_map(0).domain() S^1 sage: W.inclusion_map(2).domain() S^1
>>> from sage.all import * >>> S1 = simplicial_sets.Sphere(Integer(1)) >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> W = S1.disjoint_union(S2, S1) >>> W.inclusion_map(Integer(1)) Simplicial set morphism: From: S^2 To: Disjoint union: (S^1 u S^2 u S^1) Defn: [v_0, sigma_2] --> [v_0, sigma_2] >>> W.inclusion_map(Integer(0)).domain() S^1 >>> W.inclusion_map(Integer(2)).domain() S^1
- class sage.topology.simplicial_set_constructions.Factors[source]#
Bases:
object
Classes which inherit from this should define a
_factors
attribute for their instances, and this class accesses that attribute. This is used byProductOfSimplicialSets
,WedgeOfSimplicialSets
, andDisjointUnionOfSimplicialSets
.- factor(i)[source]#
Return the \(i\)-th factor of this construction of simplicial sets.
INPUT:
i
– integer, the index of the factor
EXAMPLES:
sage: S2 = simplicial_sets.Sphere(2) sage: S3 = simplicial_sets.Sphere(3) sage: K = S2.disjoint_union(S3) sage: K.factor(0) S^2 sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: X = B.wedge(S3, B) sage: X.factor(1) S^3 sage: X.factor(2) Classifying space of Multiplicative Abelian group isomorphic to C2
>>> from sage.all import * >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> K = S2.disjoint_union(S3) >>> K.factor(Integer(0)) S^2 >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> X = B.wedge(S3, B) >>> X.factor(Integer(1)) S^3 >>> X.factor(Integer(2)) Classifying space of Multiplicative Abelian group isomorphic to C2
- factors()[source]#
Return the factors involved in this construction of simplicial sets.
EXAMPLES:
sage: S2 = simplicial_sets.Sphere(2) sage: S3 = simplicial_sets.Sphere(3) sage: S2.wedge(S3).factors() == (S2, S3) True sage: S2.product(S3).factors()[0] S^2
>>> from sage.all import * >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> S2.wedge(S3).factors() == (S2, S3) True >>> S2.product(S3).factors()[Integer(0)] S^2
- class sage.topology.simplicial_set_constructions.ProductOfSimplicialSets(factors=None)[source]#
Bases:
PullbackOfSimplicialSets
,Factors
Return the product of simplicial sets.
INPUT:
factors
– a list or tuple of simplicial sets
Return the product of the simplicial sets in
factors
.If \(X\) and \(Y\) are simplicial sets, then their product \(X \times Y\) is defined to be the simplicial set with \(n\)-simplices \(X_n \times Y_n\). Therefore the simplices in the product have the form \((s_I \sigma, s_J \tau)\), where \(s_I = s_{i_1} ... s_{i_p}\) and \(s_J = s_{j_1} ... s_{j_q}\) are composites of degeneracy maps, written in decreasing order. Such a simplex is nondegenerate if the indices \(I\) and \(J\) are disjoint. Therefore if \(\sigma\) and \(\tau\) are nondegenerate simplices of dimensions \(m\) and \(n\), in the product they will lead to nondegenerate simplices up to dimension \(m+n\), and no further.
This extends in the more or less obvious way to products with more than two factors: with three factors, a simplex \((s_I \sigma, s_J \tau, s_K \rho)\) is nondegenerate if \(I \cap J \cap K\) is empty, etc.
If a simplicial set is constructed as a product, the factors are recorded and are accessible via the method
Factors.factors()
. If it is constructed as a product and then copied, this information is lost.EXAMPLES:
sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet sage: v = AbstractSimplex(0, name='v') sage: w = AbstractSimplex(0, name='w') sage: e = AbstractSimplex(1, name='e') sage: X = SimplicialSet({e: (v, w)}) sage: square = X.product(X)
>>> from sage.all import * >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet >>> v = AbstractSimplex(Integer(0), name='v') >>> w = AbstractSimplex(Integer(0), name='w') >>> e = AbstractSimplex(Integer(1), name='e') >>> X = SimplicialSet({e: (v, w)}) >>> square = X.product(X)
square
is now the standard triangulation of the square: 4 vertices, 5 edges (the four on the border plus the diagonal), 2 triangles:sage: square.f_vector() [4, 5, 2] sage: S1 = simplicial_sets.Sphere(1) sage: T = S1.product(S1) sage: T.homology(reduced=False) # needs sage.modules {0: Z, 1: Z x Z, 2: Z}
>>> from sage.all import * >>> square.f_vector() [4, 5, 2] >>> S1 = simplicial_sets.Sphere(Integer(1)) >>> T = S1.product(S1) >>> T.homology(reduced=False) # needs sage.modules {0: Z, 1: Z x Z, 2: Z}
Since
S1
is pointed, so isT
:sage: S1.is_pointed() True sage: S1.base_point() v_0 sage: T.is_pointed() True sage: T.base_point() (v_0, v_0) sage: S2 = simplicial_sets.Sphere(2) sage: S3 = simplicial_sets.Sphere(3) sage: Z = S2.product(S3) sage: Z.homology() # needs sage.modules {0: 0, 1: 0, 2: Z, 3: Z, 4: 0, 5: Z}
>>> from sage.all import * >>> S1.is_pointed() True >>> S1.base_point() v_0 >>> T.is_pointed() True >>> T.base_point() (v_0, v_0) >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> Z = S2.product(S3) >>> Z.homology() # needs sage.modules {0: 0, 1: 0, 2: Z, 3: Z, 4: 0, 5: Z}
Products involving infinite simplicial sets:
sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: B.rename('RP^oo') sage: X = B.product(B); X RP^oo x RP^oo sage: X.n_cells(1) [(f, f), (f, s_0 1), (s_0 1, f)] sage: X.homology(range(3), base_ring=GF(2)) # needs sage.modules {0: Vector space of dimension 0 over Finite Field of size 2, 1: Vector space of dimension 2 over Finite Field of size 2, 2: Vector space of dimension 3 over Finite Field of size 2} sage: Y = B.product(S2) sage: Y.homology(range(5), base_ring=GF(2)) # needs sage.modules {0: Vector space of dimension 0 over Finite Field of size 2, 1: Vector space of dimension 1 over Finite Field of size 2, 2: Vector space of dimension 2 over Finite Field of size 2, 3: Vector space of dimension 2 over Finite Field of size 2, 4: Vector space of dimension 2 over Finite Field of size 2}
>>> from sage.all import * >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> B.rename('RP^oo') >>> X = B.product(B); X RP^oo x RP^oo >>> X.n_cells(Integer(1)) [(f, f), (f, s_0 1), (s_0 1, f)] >>> X.homology(range(Integer(3)), base_ring=GF(Integer(2))) # needs sage.modules {0: Vector space of dimension 0 over Finite Field of size 2, 1: Vector space of dimension 2 over Finite Field of size 2, 2: Vector space of dimension 3 over Finite Field of size 2} >>> Y = B.product(S2) >>> Y.homology(range(Integer(5)), base_ring=GF(Integer(2))) # needs sage.modules {0: Vector space of dimension 0 over Finite Field of size 2, 1: Vector space of dimension 1 over Finite Field of size 2, 2: Vector space of dimension 2 over Finite Field of size 2, 3: Vector space of dimension 2 over Finite Field of size 2, 4: Vector space of dimension 2 over Finite Field of size 2}
- factor(i, as_subset=False)[source]#
Return the \(i\)-th factor of the product.
INPUT:
i
– integer, the index of the factoras_subset
– boolean, optional (defaultFalse
)
If
as_subset
isTrue
, return the \(i\)-th factor as a subsimplicial set of the product, identifying it with its product with the base point in each other factor. As a subsimplicial set, it comes equipped with an inclusion map. This option will raise an error if any factor does not have a base point.If
as_subset
isFalse
, return the \(i\)-th factor in its original form as a simplicial set.EXAMPLES:
sage: S2 = simplicial_sets.Sphere(2) sage: S3 = simplicial_sets.Sphere(3) sage: K = S2.product(S3) sage: K.factor(0) S^2 sage: K.factor(0, as_subset=True) Simplicial set with 2 non-degenerate simplices sage: K.factor(0, as_subset=True).homology() # needs sage.modules {0: 0, 1: 0, 2: Z} sage: K.factor(0) is S2 True sage: K.factor(0, as_subset=True) is S2 False
>>> from sage.all import * >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> K = S2.product(S3) >>> K.factor(Integer(0)) S^2 >>> K.factor(Integer(0), as_subset=True) Simplicial set with 2 non-degenerate simplices >>> K.factor(Integer(0), as_subset=True).homology() # needs sage.modules {0: 0, 1: 0, 2: Z} >>> K.factor(Integer(0)) is S2 True >>> K.factor(Integer(0), as_subset=True) is S2 False
- n_skeleton(n)[source]#
Return the \(n\)-skeleton of this simplicial set.
That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).
INPUT:
n
– the dimension
In the finite case, this returns the ordinary \(n\)-skeleton. In the infinite case, it computes the \(n\)-skeleton of the product of the \(n\)-skeleta of the factors.
EXAMPLES:
sage: S2 = simplicial_sets.Sphere(2) sage: S3 = simplicial_sets.Sphere(3) sage: S2.product(S3).n_skeleton(2) Simplicial set with 2 non-degenerate simplices sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: X = B.product(B) sage: X.n_skeleton(2) Simplicial set with 13 non-degenerate simplices
>>> from sage.all import * >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> S2.product(S3).n_skeleton(Integer(2)) Simplicial set with 2 non-degenerate simplices >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> X = B.product(B) >>> X.n_skeleton(Integer(2)) Simplicial set with 13 non-degenerate simplices
- class sage.topology.simplicial_set_constructions.ProductOfSimplicialSets_finite(factors=None)[source]#
Bases:
ProductOfSimplicialSets
,PullbackOfSimplicialSets_finite
The product of finite simplicial sets.
When the factors are all finite, there are more methods available for the resulting product, as compared to products with infinite factors: projection maps, the wedge as a subcomplex, and the fat wedge as a subcomplex. See
projection_map()
,wedge_as_subset()
, andfat_wedge_as_subset()
- fat_wedge_as_subset()[source]#
Return the fat wedge as a subsimplicial set of this product of pointed simplicial sets.
The fat wedge consists of those terms where at least one factor is the base point. Thus with two factors this is the ordinary wedge, but with more factors, it is larger.
EXAMPLES:
sage: S1 = simplicial_sets.Sphere(1) sage: X = S1.product(S1, S1) sage: W = X.fat_wedge_as_subset() sage: W.homology() # needs sage.modules {0: 0, 1: Z x Z x Z, 2: Z x Z x Z}
>>> from sage.all import * >>> S1 = simplicial_sets.Sphere(Integer(1)) >>> X = S1.product(S1, S1) >>> W = X.fat_wedge_as_subset() >>> W.homology() # needs sage.modules {0: 0, 1: Z x Z x Z, 2: Z x Z x Z}
- projection_map(i)[source]#
Return the map projecting onto the \(i\)-th factor.
INPUT:
i
– integer, the index of the projection map
EXAMPLES:
sage: T = simplicial_sets.Torus() sage: f_0 = T.projection_map(0) sage: f_1 = T.projection_map(1) sage: # needs sage.modules sage: m_0 = f_0.induced_homology_morphism().to_matrix(1) # matrix in dim 1 sage: m_1 = f_1.induced_homology_morphism().to_matrix(1) sage: m_0.rank() 1 sage: m_0 == m_1 False
>>> from sage.all import * >>> T = simplicial_sets.Torus() >>> f_0 = T.projection_map(Integer(0)) >>> f_1 = T.projection_map(Integer(1)) >>> # needs sage.modules >>> m_0 = f_0.induced_homology_morphism().to_matrix(Integer(1)) # matrix in dim 1 >>> m_1 = f_1.induced_homology_morphism().to_matrix(Integer(1)) >>> m_0.rank() 1 >>> m_0 == m_1 False
- wedge_as_subset()[source]#
Return the wedge as a subsimplicial set of this product of pointed simplicial sets.
This will raise an error if any factor is not pointed.
EXAMPLES:
sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet sage: v = AbstractSimplex(0, name='v') sage: e = AbstractSimplex(1, name='e') sage: w = AbstractSimplex(0, name='w') sage: f = AbstractSimplex(1, name='f') sage: X = SimplicialSet({e: (v, v)}, base_point=v) sage: Y = SimplicialSet({f: (w, w)}, base_point=w) sage: P = X.product(Y) sage: W = P.wedge_as_subset() sage: W.nondegenerate_simplices() [(v, w), (e, s_0 w), (s_0 v, f)] sage: W.homology() # needs sage.modules {0: 0, 1: Z x Z}
>>> from sage.all import * >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet >>> v = AbstractSimplex(Integer(0), name='v') >>> e = AbstractSimplex(Integer(1), name='e') >>> w = AbstractSimplex(Integer(0), name='w') >>> f = AbstractSimplex(Integer(1), name='f') >>> X = SimplicialSet({e: (v, v)}, base_point=v) >>> Y = SimplicialSet({f: (w, w)}, base_point=w) >>> P = X.product(Y) >>> W = P.wedge_as_subset() >>> W.nondegenerate_simplices() [(v, w), (e, s_0 w), (s_0 v, f)] >>> W.homology() # needs sage.modules {0: 0, 1: Z x Z}
- class sage.topology.simplicial_set_constructions.PullbackOfSimplicialSets(maps=None)[source]#
Bases:
SimplicialSet_arbitrary
,UniqueRepresentation
Return the pullback obtained from the morphisms
maps
.INPUT:
maps
– a list or tuple of morphisms of simplicial sets
If only a single map \(f: X \to Y\) is given, then return \(X\). If no maps are given, return the one-point simplicial set. Otherwise, given a simplicial set \(Y\) and maps \(f_i: X_i \to Y\) for \(0 \leq i \leq m\), construct the pullback \(P\): see Wikipedia article Pullback_(category_theory). This is constructed as pullbacks of sets for each set of \(n\)-simplices, so \(P_n\) is the subset of the product \(\prod (X_i)_n\) consisting of those elements \((x_i)\) for which \(f_i(x_i) = f_j(x_j)\) for all \(i\), \(j\).
This is pointed if the maps \(f_i\) are.
EXAMPLES:
The pullback of a quotient map by a subsimplicial set and the base point map gives a simplicial set isomorphic to the original subcomplex:
sage: # needs sage.groups sage: RP5 = simplicial_sets.RealProjectiveSpace(5) sage: K = RP5.quotient(RP5.n_skeleton(2)) sage: X = K.pullback(K.quotient_map(), K.base_point_map()) sage: X.homology() == RP5.n_skeleton(2).homology() # needs sage.modules True
>>> from sage.all import * >>> # needs sage.groups >>> RP5 = simplicial_sets.RealProjectiveSpace(Integer(5)) >>> K = RP5.quotient(RP5.n_skeleton(Integer(2))) >>> X = K.pullback(K.quotient_map(), K.base_point_map()) >>> X.homology() == RP5.n_skeleton(Integer(2)).homology() # needs sage.modules True
Pullbacks of identity maps:
sage: S2 = simplicial_sets.Sphere(2) sage: one = S2.Hom(S2).identity() sage: P = S2.pullback(one, one) sage: P.homology() # needs sage.modules {0: 0, 1: 0, 2: Z}
>>> from sage.all import * >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> one = S2.Hom(S2).identity() >>> P = S2.pullback(one, one) >>> P.homology() # needs sage.modules {0: 0, 1: 0, 2: Z}
The pullback is constructed in terms of the product – of course, the product is a special case of the pullback – and the simplices are named appropriately:
sage: P.nondegenerate_simplices() [(v_0, v_0), (sigma_2, sigma_2)]
>>> from sage.all import * >>> P.nondegenerate_simplices() [(v_0, v_0), (sigma_2, sigma_2)]
- defining_map(i)[source]#
Return the \(i\)-th map defining the pullback.
INPUT:
i
– integer
If this pullback was constructed as
Y.pullback(f_0, f_1, ...)
, this returns \(f_i\).EXAMPLES:
sage: # needs sage.groups sage: RP5 = simplicial_sets.RealProjectiveSpace(5) sage: K = RP5.quotient(RP5.n_skeleton(2)) sage: Y = K.pullback(K.quotient_map(), K.base_point_map()) sage: Y.defining_map(1) Simplicial set morphism: From: Point To: Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) Defn: Constant map at * sage: Y.defining_map(0).domain() RP^5
>>> from sage.all import * >>> # needs sage.groups >>> RP5 = simplicial_sets.RealProjectiveSpace(Integer(5)) >>> K = RP5.quotient(RP5.n_skeleton(Integer(2))) >>> Y = K.pullback(K.quotient_map(), K.base_point_map()) >>> Y.defining_map(Integer(1)) Simplicial set morphism: From: Point To: Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) Defn: Constant map at * >>> Y.defining_map(Integer(0)).domain() RP^5
- n_skeleton(n)[source]#
Return the \(n\)-skeleton of this simplicial set.
That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).
INPUT:
n
– the dimension
The \(n\)-skeleton of the pullback is computed as the pullback of the \(n\)-skeleta of the component simplicial sets.
EXAMPLES:
sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: one = Hom(B,B).identity() sage: c = Hom(B,B).constant_map() sage: P = B.pullback(one, c) sage: P.n_skeleton(2) Pullback of maps: Simplicial set endomorphism of Simplicial set with 3 non-degenerate simplices Defn: Identity map Simplicial set endomorphism of Simplicial set with 3 non-degenerate simplices Defn: Constant map at 1 sage: P.n_skeleton(3).homology() # needs sage.modules {0: 0, 1: C2, 2: 0, 3: Z}
>>> from sage.all import * >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> one = Hom(B,B).identity() >>> c = Hom(B,B).constant_map() >>> P = B.pullback(one, c) >>> P.n_skeleton(Integer(2)) Pullback of maps: Simplicial set endomorphism of Simplicial set with 3 non-degenerate simplices Defn: Identity map Simplicial set endomorphism of Simplicial set with 3 non-degenerate simplices Defn: Constant map at 1 >>> P.n_skeleton(Integer(3)).homology() # needs sage.modules {0: 0, 1: C2, 2: 0, 3: Z}
- class sage.topology.simplicial_set_constructions.PullbackOfSimplicialSets_finite(maps=None)[source]#
Bases:
PullbackOfSimplicialSets
,SimplicialSet_finite
The pullback of finite simplicial sets obtained from
maps
.When the simplicial sets involved are all finite, there are more methods available to the resulting pullback, as compared to case when some of the components are infinite: the structure maps from the pullback and the pullback’s universal property: see
structure_map()
anduniversal_property()
.- projection_map(i)[source]#
Return the \(i\)-th projection map of the pullback.
INPUT:
i
– integer
If this pullback \(P\) was constructed as
Y.pullback(f_0, f_1, ...)
, where \(f_i: X_i \to Y\), then there are structure maps \(\bar{f}_i: P \to X_i\). This method constructs \(\bar{f}_i\).EXAMPLES:
sage: # needs sage.groups sage: RP5 = simplicial_sets.RealProjectiveSpace(5) sage: K = RP5.quotient(RP5.n_skeleton(2)) sage: Y = K.pullback(K.quotient_map(), K.base_point_map()) sage: Y.structure_map(0) Simplicial set morphism: From: Pullback of maps: Simplicial set morphism: From: RP^5 To: Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) Defn: [1, f, f * f, f * f * f, f * f * f * f, f * f * f * f * f] --> [*, s_0 *, s_1 s_0 *, f * f * f, f * f * f * f, f * f * f * f * f] Simplicial set morphism: From: Point To: Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) Defn: Constant map at * To: RP^5 Defn: [(1, *), (f, s_0 *), (f * f, s_1 s_0 *)] --> [1, f, f * f] sage: Y.structure_map(1).codomain() Point
>>> from sage.all import * >>> # needs sage.groups >>> RP5 = simplicial_sets.RealProjectiveSpace(Integer(5)) >>> K = RP5.quotient(RP5.n_skeleton(Integer(2))) >>> Y = K.pullback(K.quotient_map(), K.base_point_map()) >>> Y.structure_map(Integer(0)) Simplicial set morphism: From: Pullback of maps: Simplicial set morphism: From: RP^5 To: Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) Defn: [1, f, f * f, f * f * f, f * f * f * f, f * f * f * f * f] --> [*, s_0 *, s_1 s_0 *, f * f * f, f * f * f * f, f * f * f * f * f] Simplicial set morphism: From: Point To: Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) Defn: Constant map at * To: RP^5 Defn: [(1, *), (f, s_0 *), (f * f, s_1 s_0 *)] --> [1, f, f * f] >>> Y.structure_map(Integer(1)).codomain() Point
These maps are also accessible via
projection_map()
:sage: Y.projection_map(1).codomain() # needs sage.groups Point
>>> from sage.all import * >>> Y.projection_map(Integer(1)).codomain() # needs sage.groups Point
- structure_map(i)[source]#
Return the \(i\)-th projection map of the pullback.
INPUT:
i
– integer
If this pullback \(P\) was constructed as
Y.pullback(f_0, f_1, ...)
, where \(f_i: X_i \to Y\), then there are structure maps \(\bar{f}_i: P \to X_i\). This method constructs \(\bar{f}_i\).EXAMPLES:
sage: # needs sage.groups sage: RP5 = simplicial_sets.RealProjectiveSpace(5) sage: K = RP5.quotient(RP5.n_skeleton(2)) sage: Y = K.pullback(K.quotient_map(), K.base_point_map()) sage: Y.structure_map(0) Simplicial set morphism: From: Pullback of maps: Simplicial set morphism: From: RP^5 To: Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) Defn: [1, f, f * f, f * f * f, f * f * f * f, f * f * f * f * f] --> [*, s_0 *, s_1 s_0 *, f * f * f, f * f * f * f, f * f * f * f * f] Simplicial set morphism: From: Point To: Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) Defn: Constant map at * To: RP^5 Defn: [(1, *), (f, s_0 *), (f * f, s_1 s_0 *)] --> [1, f, f * f] sage: Y.structure_map(1).codomain() Point
>>> from sage.all import * >>> # needs sage.groups >>> RP5 = simplicial_sets.RealProjectiveSpace(Integer(5)) >>> K = RP5.quotient(RP5.n_skeleton(Integer(2))) >>> Y = K.pullback(K.quotient_map(), K.base_point_map()) >>> Y.structure_map(Integer(0)) Simplicial set morphism: From: Pullback of maps: Simplicial set morphism: From: RP^5 To: Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) Defn: [1, f, f * f, f * f * f, f * f * f * f, f * f * f * f * f] --> [*, s_0 *, s_1 s_0 *, f * f * f, f * f * f * f, f * f * f * f * f] Simplicial set morphism: From: Point To: Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) Defn: Constant map at * To: RP^5 Defn: [(1, *), (f, s_0 *), (f * f, s_1 s_0 *)] --> [1, f, f * f] >>> Y.structure_map(Integer(1)).codomain() Point
These maps are also accessible via
projection_map()
:sage: Y.projection_map(1).codomain() # needs sage.groups Point
>>> from sage.all import * >>> Y.projection_map(Integer(1)).codomain() # needs sage.groups Point
- universal_property(*maps)[source]#
Return the map induced by
maps
.INPUT:
maps
– maps from a simplicial set \(Z\) to the “factors” \(X_i\) forming the pullback.
If the pullback \(P\) is formed by maps \(f_i: X_i \to Y\), then given maps \(g_i: Z \to X_i\) such that \(f_i g_i = f_j g_j\) for all \(i\), \(j\), then there is a unique map \(g: Z \to P\) making the appropriate diagram commute. This constructs that map.
EXAMPLES:
sage: S1 = simplicial_sets.Sphere(1) sage: T = S1.product(S1) sage: K = T.factor(0, as_subset=True) sage: f = S1.Hom(T)({S1.n_cells(0)[0]: K.n_cells(0)[0], ....: S1.n_cells(1)[0]: K.n_cells(1)[0]}) sage: P = S1.product(T) sage: P.universal_property(S1.Hom(S1).identity(), f) Simplicial set morphism: From: S^1 To: S^1 x S^1 x S^1 Defn: [v_0, sigma_1] --> [(v_0, (v_0, v_0)), (sigma_1, (sigma_1, s_0 v_0))]
>>> from sage.all import * >>> S1 = simplicial_sets.Sphere(Integer(1)) >>> T = S1.product(S1) >>> K = T.factor(Integer(0), as_subset=True) >>> f = S1.Hom(T)({S1.n_cells(Integer(0))[Integer(0)]: K.n_cells(Integer(0))[Integer(0)], ... S1.n_cells(Integer(1))[Integer(0)]: K.n_cells(Integer(1))[Integer(0)]}) >>> P = S1.product(T) >>> P.universal_property(S1.Hom(S1).identity(), f) Simplicial set morphism: From: S^1 To: S^1 x S^1 x S^1 Defn: [v_0, sigma_1] --> [(v_0, (v_0, v_0)), (sigma_1, (sigma_1, s_0 v_0))]
- class sage.topology.simplicial_set_constructions.PushoutOfSimplicialSets(maps=None, vertex_name=None)[source]#
Bases:
SimplicialSet_arbitrary
,UniqueRepresentation
Return the pushout obtained from the morphisms
maps
.INPUT:
maps
– a list or tuple of morphisms of simplicial setsvertex_name
– optional, defaultNone
If only a single map \(f: X \to Y\) is given, then return \(Y\). If no maps are given, return the empty simplicial set. Otherwise, given a simplicial set \(X\) and maps \(f_i: X \to Y_i\) for \(0 \leq i \leq m\), construct the pushout \(P\): see Wikipedia article Pushout_(category_theory). This is constructed as pushouts of sets for each set of \(n\)-simplices, so \(P_n\) is the disjoint union of the sets \((Y_i)_n\), with elements \(f_i(x)\) identified for \(n\)-simplex \(x\) in \(X\).
Simplices in the pushout are given names as follows: if a simplex comes from a single \(Y_i\), it inherits its name. Otherwise it must come from a simplex (or several) in \(X\), and then it inherits one of those names, and it should be the first alphabetically. For example, if vertices \(v\), \(w\), and \(z\) in \(X\) are glued together, then the resulting vertex in the pushout will be called \(v\).
Base points are taken care of automatically: if each of the maps \(f_i\) is pointed, so is the pushout. If \(X\) is a point or if \(X\) is nonempty and any of the spaces \(Y_i\) is a point, use those for the base point. In all of these cases, if
vertex_name
isNone
, generate the name of the base point automatically; otherwise, usevertex_name
for its name.In all other cases, the pushout is not pointed.
EXAMPLES:
sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet sage: v = AbstractSimplex(0, name='v') sage: a = AbstractSimplex(0, name='a') sage: b = AbstractSimplex(0, name='b') sage: c = AbstractSimplex(0, name='c') sage: e0 = AbstractSimplex(1, name='e_0') sage: e1 = AbstractSimplex(1, name='e_1') sage: e2 = AbstractSimplex(1, name='e_2') sage: X = SimplicialSet({e2: (b, a)}) sage: Y0 = SimplicialSet({e2: (b,a), e0: (c,b), e1: (c,a)}) sage: Y1 = simplicial_sets.Simplex(0) sage: f0_data = {a:a, b:b, e2: e2} sage: v = Y1.n_cells(0)[0] sage: f1_data = {a:v, b:v, e2:v.apply_degeneracies(0)} sage: f0 = X.Hom(Y0)(f0_data) sage: f1 = X.Hom(Y1)(f1_data) sage: P = X.pushout(f0, f1) sage: P.nondegenerate_simplices() [a, c, e_0, e_1]
>>> from sage.all import * >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet >>> v = AbstractSimplex(Integer(0), name='v') >>> a = AbstractSimplex(Integer(0), name='a') >>> b = AbstractSimplex(Integer(0), name='b') >>> c = AbstractSimplex(Integer(0), name='c') >>> e0 = AbstractSimplex(Integer(1), name='e_0') >>> e1 = AbstractSimplex(Integer(1), name='e_1') >>> e2 = AbstractSimplex(Integer(1), name='e_2') >>> X = SimplicialSet({e2: (b, a)}) >>> Y0 = SimplicialSet({e2: (b,a), e0: (c,b), e1: (c,a)}) >>> Y1 = simplicial_sets.Simplex(Integer(0)) >>> f0_data = {a:a, b:b, e2: e2} >>> v = Y1.n_cells(Integer(0))[Integer(0)] >>> f1_data = {a:v, b:v, e2:v.apply_degeneracies(Integer(0))} >>> f0 = X.Hom(Y0)(f0_data) >>> f1 = X.Hom(Y1)(f1_data) >>> P = X.pushout(f0, f1) >>> P.nondegenerate_simplices() [a, c, e_0, e_1]
There are defining maps \(f_i: X \to Y_i\) and structure maps \(\bar{f}_i: Y_i \to P\); the latter are only implemented in Sage when each \(Y_i\) is finite.
sage: P.defining_map(0) == f0 True sage: P.structure_map(1) Simplicial set morphism: From: 0-simplex To: Pushout of maps: Simplicial set morphism: From: Simplicial set with 3 non-degenerate simplices To: Simplicial set with 6 non-degenerate simplices Defn: [a, b, e_2] --> [a, b, e_2] Simplicial set morphism: From: Simplicial set with 3 non-degenerate simplices To: 0-simplex Defn: Constant map at (0,) Defn: Constant map at a sage: P.structure_map(0).domain() == Y0 True sage: P.structure_map(0).codomain() == P True
>>> from sage.all import * >>> P.defining_map(Integer(0)) == f0 True >>> P.structure_map(Integer(1)) Simplicial set morphism: From: 0-simplex To: Pushout of maps: Simplicial set morphism: From: Simplicial set with 3 non-degenerate simplices To: Simplicial set with 6 non-degenerate simplices Defn: [a, b, e_2] --> [a, b, e_2] Simplicial set morphism: From: Simplicial set with 3 non-degenerate simplices To: 0-simplex Defn: Constant map at (0,) Defn: Constant map at a >>> P.structure_map(Integer(0)).domain() == Y0 True >>> P.structure_map(Integer(0)).codomain() == P True
An inefficient way of constructing a suspension for an unpointed set: take the pushout of two copies of the inclusion map \(X \to CX\):
sage: T = simplicial_sets.Torus() sage: T = T.unset_base_point() sage: CT = T.cone() sage: inc = CT.base_as_subset().inclusion_map() sage: P = T.pushout(inc, inc) sage: P.homology() # needs sage.modules {0: 0, 1: 0, 2: Z x Z, 3: Z} sage: len(P.nondegenerate_simplices()) 20
>>> from sage.all import * >>> T = simplicial_sets.Torus() >>> T = T.unset_base_point() >>> CT = T.cone() >>> inc = CT.base_as_subset().inclusion_map() >>> P = T.pushout(inc, inc) >>> P.homology() # needs sage.modules {0: 0, 1: 0, 2: Z x Z, 3: Z} >>> len(P.nondegenerate_simplices()) 20
It is more efficient to construct the suspension as the quotient \(CX/X\):
sage: len(CT.quotient(CT.base_as_subset()).nondegenerate_simplices()) 8
>>> from sage.all import * >>> len(CT.quotient(CT.base_as_subset()).nondegenerate_simplices()) 8
It is more efficient still if the original simplicial set has a base point:
sage: T = simplicial_sets.Torus() sage: len(T.suspension().nondegenerate_simplices()) 6 sage: S1 = simplicial_sets.Sphere(1) sage: pt = simplicial_sets.Point() sage: bouquet = pt.pushout(S1.base_point_map(), ....: S1.base_point_map(), ....: S1.base_point_map()) sage: bouquet.homology(1) # needs sage.modules Z x Z x Z
>>> from sage.all import * >>> T = simplicial_sets.Torus() >>> len(T.suspension().nondegenerate_simplices()) 6 >>> S1 = simplicial_sets.Sphere(Integer(1)) >>> pt = simplicial_sets.Point() >>> bouquet = pt.pushout(S1.base_point_map(), ... S1.base_point_map(), ... S1.base_point_map()) >>> bouquet.homology(Integer(1)) # needs sage.modules Z x Z x Z
- defining_map(i)[source]#
Return the \(i\)-th map defining the pushout.
INPUT:
i
– integer
If this pushout was constructed as
X.pushout(f_0, f_1, ...)
, this returns \(f_i\).EXAMPLES:
sage: S1 = simplicial_sets.Sphere(1) sage: T = simplicial_sets.Torus() sage: X = S1.wedge(T) # a pushout sage: X.defining_map(0) Simplicial set morphism: From: Point To: S^1 Defn: Constant map at v_0 sage: X.defining_map(1).domain() Point sage: X.defining_map(1).codomain() Torus
>>> from sage.all import * >>> S1 = simplicial_sets.Sphere(Integer(1)) >>> T = simplicial_sets.Torus() >>> X = S1.wedge(T) # a pushout >>> X.defining_map(Integer(0)) Simplicial set morphism: From: Point To: S^1 Defn: Constant map at v_0 >>> X.defining_map(Integer(1)).domain() Point >>> X.defining_map(Integer(1)).codomain() Torus
- n_skeleton(n)[source]#
Return the \(n\)-skeleton of this simplicial set.
That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).
INPUT:
n
– the dimension
The \(n\)-skeleton of the pushout is computed as the pushout of the \(n\)-skeleta of the component simplicial sets.
EXAMPLES:
sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: K = B.n_skeleton(3) sage: Q = K.pushout(K.inclusion_map(), K.constant_map()) sage: Q.n_skeleton(5).homology() # needs sage.modules {0: 0, 1: 0, 2: 0, 3: 0, 4: Z, 5: Z}
>>> from sage.all import * >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> K = B.n_skeleton(Integer(3)) >>> Q = K.pushout(K.inclusion_map(), K.constant_map()) >>> Q.n_skeleton(Integer(5)).homology() # needs sage.modules {0: 0, 1: 0, 2: 0, 3: 0, 4: Z, 5: Z}
Of course, computing the \(n\)-skeleton and then taking homology need not yield the same answer as asking for homology through dimension \(n\), since the latter computation will use the \((n+1)\)-skeleton:
sage: Q.homology(range(6)) # needs sage.groups sage.modules {0: 0, 1: 0, 2: 0, 3: 0, 4: Z, 5: C2}
>>> from sage.all import * >>> Q.homology(range(Integer(6))) # needs sage.groups sage.modules {0: 0, 1: 0, 2: 0, 3: 0, 4: Z, 5: C2}
- class sage.topology.simplicial_set_constructions.PushoutOfSimplicialSets_finite(maps=None, vertex_name=None)[source]#
Bases:
PushoutOfSimplicialSets
,SimplicialSet_finite
The pushout of finite simplicial sets obtained from
maps
.When the simplicial sets involved are all finite, there are more methods available to the resulting pushout, as compared to case when some of the components are infinite: the structure maps to the pushout and the pushout’s universal property: see
structure_map()
anduniversal_property()
.- structure_map(i)[source]#
Return the \(i\)-th structure map of the pushout.
INPUT:
i
– integer
If this pushout \(Z\) was constructed as
X.pushout(f_0, f_1, ...)
, where \(f_i: X \to Y_i\), then there are structure maps \(\bar{f}_i: Y_i \to Z\). This method constructs \(\bar{f}_i\).EXAMPLES:
sage: S1 = simplicial_sets.Sphere(1) sage: T = simplicial_sets.Torus() sage: X = S1.disjoint_union(T) # a pushout sage: X.structure_map(0) Simplicial set morphism: From: S^1 To: Disjoint union: (S^1 u Torus) Defn: [v_0, sigma_1] --> [v_0, sigma_1] sage: X.structure_map(1).domain() Torus sage: X.structure_map(1).codomain() Disjoint union: (S^1 u Torus)
>>> from sage.all import * >>> S1 = simplicial_sets.Sphere(Integer(1)) >>> T = simplicial_sets.Torus() >>> X = S1.disjoint_union(T) # a pushout >>> X.structure_map(Integer(0)) Simplicial set morphism: From: S^1 To: Disjoint union: (S^1 u Torus) Defn: [v_0, sigma_1] --> [v_0, sigma_1] >>> X.structure_map(Integer(1)).domain() Torus >>> X.structure_map(Integer(1)).codomain() Disjoint union: (S^1 u Torus)
- universal_property(*maps)[source]#
Return the map induced by
maps
INPUT:
maps
– maps “factors” \(Y_i\) forming the pushout to a fixed simplicial set \(Z\).
If the pushout \(P\) is formed by maps \(f_i: X \to Y_i\), then given maps \(g_i: Y_i \to Z\) such that \(g_i f_i = g_j f_j\) for all \(i\), \(j\), then there is a unique map \(g: P \to Z\) making the appropriate diagram commute. This constructs that map.
EXAMPLES:
sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet sage: v = AbstractSimplex(0, name='v') sage: w = AbstractSimplex(0, name='w') sage: x = AbstractSimplex(0, name='x') sage: evw = AbstractSimplex(1, name='vw') sage: evx = AbstractSimplex(1, name='vx') sage: ewx = AbstractSimplex(1, name='wx') sage: X = SimplicialSet({evw: (w, v), evx: (x, v)}) sage: Y_0 = SimplicialSet({evw: (w, v), evx: (x, v), ewx: (x, w)}) sage: Y_1 = SimplicialSet({evx: (x, v)}) sage: f_0 = Hom(X, Y_0)({v:v, w:w, x:x, evw:evw, evx:evx}) sage: f_1 = Hom(X, Y_1)({v:v, w:v, x:x, ....: evw:v.apply_degeneracies(0), evx:evx}) sage: P = X.pushout(f_0, f_1) sage: one = Hom(Y_1, Y_1).identity() sage: g = Hom(Y_0, Y_1)({v:v, w:v, x:x, ....: evw:v.apply_degeneracies(0), evx:evx, ewx:evx}) sage: P.universal_property(g, one) Simplicial set morphism: From: Pushout of maps: Simplicial set morphism: From: Simplicial set with 5 non-degenerate simplices To: Simplicial set with 6 non-degenerate simplices Defn: [v, w, x, vw, vx] --> [v, w, x, vw, vx] Simplicial set morphism: From: Simplicial set with 5 non-degenerate simplices To: Simplicial set with 3 non-degenerate simplices Defn: [v, w, x, vw, vx] --> [v, v, x, s_0 v, vx] To: Simplicial set with 3 non-degenerate simplices Defn: [v, x, vx, wx] --> [v, x, vx, vx]
>>> from sage.all import * >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet >>> v = AbstractSimplex(Integer(0), name='v') >>> w = AbstractSimplex(Integer(0), name='w') >>> x = AbstractSimplex(Integer(0), name='x') >>> evw = AbstractSimplex(Integer(1), name='vw') >>> evx = AbstractSimplex(Integer(1), name='vx') >>> ewx = AbstractSimplex(Integer(1), name='wx') >>> X = SimplicialSet({evw: (w, v), evx: (x, v)}) >>> Y_0 = SimplicialSet({evw: (w, v), evx: (x, v), ewx: (x, w)}) >>> Y_1 = SimplicialSet({evx: (x, v)}) >>> f_0 = Hom(X, Y_0)({v:v, w:w, x:x, evw:evw, evx:evx}) >>> f_1 = Hom(X, Y_1)({v:v, w:v, x:x, ... evw:v.apply_degeneracies(Integer(0)), evx:evx}) >>> P = X.pushout(f_0, f_1) >>> one = Hom(Y_1, Y_1).identity() >>> g = Hom(Y_0, Y_1)({v:v, w:v, x:x, ... evw:v.apply_degeneracies(Integer(0)), evx:evx, ewx:evx}) >>> P.universal_property(g, one) Simplicial set morphism: From: Pushout of maps: Simplicial set morphism: From: Simplicial set with 5 non-degenerate simplices To: Simplicial set with 6 non-degenerate simplices Defn: [v, w, x, vw, vx] --> [v, w, x, vw, vx] Simplicial set morphism: From: Simplicial set with 5 non-degenerate simplices To: Simplicial set with 3 non-degenerate simplices Defn: [v, w, x, vw, vx] --> [v, v, x, s_0 v, vx] To: Simplicial set with 3 non-degenerate simplices Defn: [v, x, vx, wx] --> [v, x, vx, vx]
- class sage.topology.simplicial_set_constructions.QuotientOfSimplicialSet(inclusion, vertex_name='*')[source]#
Bases:
PushoutOfSimplicialSets
Return the quotient of a simplicial set by a subsimplicial set.
INPUT:
inclusion
– inclusion map of a subcomplex (= subsimplicial set) of a simplicial setvertex_name
– optional, default'*'
A subcomplex \(A\) comes equipped with the inclusion map \(A \to X\) to its ambient complex \(X\), and this constructs the quotient \(X/A\), collapsing \(A\) to a point. The resulting point is called
vertex_name
, which is'*'
by default.When the simplicial sets involved are finite, there is a
QuotientOfSimplicialSet_finite.quotient_map()
method available.EXAMPLES:
sage: # needs sage.groups sage: RP5 = simplicial_sets.RealProjectiveSpace(5) sage: RP2 = RP5.n_skeleton(2) sage: RP5_2 = RP5.quotient(RP2); RP5_2 Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) sage: RP5_2.quotient_map() Simplicial set morphism: From: RP^5 To: Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) Defn: [1, f, f * f, f * f * f, f * f * f * f, f * f * f * f * f] --> [*, s_0 *, s_1 s_0 *, f * f * f, f * f * f * f, f * f * f * f * f]
>>> from sage.all import * >>> # needs sage.groups >>> RP5 = simplicial_sets.RealProjectiveSpace(Integer(5)) >>> RP2 = RP5.n_skeleton(Integer(2)) >>> RP5_2 = RP5.quotient(RP2); RP5_2 Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) >>> RP5_2.quotient_map() Simplicial set morphism: From: RP^5 To: Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices) Defn: [1, f, f * f, f * f * f, f * f * f * f, f * f * f * f * f] --> [*, s_0 *, s_1 s_0 *, f * f * f, f * f * f * f, f * f * f * f * f]
- ambient()[source]#
Return the ambient space.
That is, if this quotient is \(K/L\), return \(K\).
EXAMPLES:
sage: # needs sage.groups sage: RP5 = simplicial_sets.RealProjectiveSpace(5) sage: RP2 = RP5.n_skeleton(2) sage: RP5_2 = RP5.quotient(RP2) sage: RP5_2.ambient() RP^5 sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: K = B.n_skeleton(3) sage: Q = B.quotient(K) sage: Q.ambient() Classifying space of Multiplicative Abelian group isomorphic to C2
>>> from sage.all import * >>> # needs sage.groups >>> RP5 = simplicial_sets.RealProjectiveSpace(Integer(5)) >>> RP2 = RP5.n_skeleton(Integer(2)) >>> RP5_2 = RP5.quotient(RP2) >>> RP5_2.ambient() RP^5 >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> K = B.n_skeleton(Integer(3)) >>> Q = B.quotient(K) >>> Q.ambient() Classifying space of Multiplicative Abelian group isomorphic to C2
- n_skeleton(n)[source]#
Return the \(n\)-skeleton of this simplicial set.
That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).
INPUT:
n
– the dimension
The \(n\)-skeleton of the quotient is computed as the quotient of the \(n\)-skeleta.
EXAMPLES:
sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: K = B.n_skeleton(3) sage: Q = B.quotient(K) sage: Q.n_skeleton(6) Quotient: (Simplicial set with 7 non-degenerate simplices/Simplicial set with 4 non-degenerate simplices) sage: Q.n_skeleton(6).homology() # needs sage.modules {0: 0, 1: 0, 2: 0, 3: 0, 4: Z, 5: C2, 6: 0}
>>> from sage.all import * >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> K = B.n_skeleton(Integer(3)) >>> Q = B.quotient(K) >>> Q.n_skeleton(Integer(6)) Quotient: (Simplicial set with 7 non-degenerate simplices/Simplicial set with 4 non-degenerate simplices) >>> Q.n_skeleton(Integer(6)).homology() # needs sage.modules {0: 0, 1: 0, 2: 0, 3: 0, 4: Z, 5: C2, 6: 0}
- subcomplex()[source]#
Return the subcomplex space associated to this quotient.
That is, if this quotient is \(K/L\), return \(L\).
EXAMPLES:
sage: # needs sage.groups sage: RP5 = simplicial_sets.RealProjectiveSpace(5) sage: RP2 = RP5.n_skeleton(2) sage: RP5_2 = RP5.quotient(RP2) sage: RP5_2.subcomplex() Simplicial set with 3 non-degenerate simplices sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: K = B.n_skeleton(3) sage: Q = B.quotient(K) sage: Q.subcomplex() Simplicial set with 4 non-degenerate simplices
>>> from sage.all import * >>> # needs sage.groups >>> RP5 = simplicial_sets.RealProjectiveSpace(Integer(5)) >>> RP2 = RP5.n_skeleton(Integer(2)) >>> RP5_2 = RP5.quotient(RP2) >>> RP5_2.subcomplex() Simplicial set with 3 non-degenerate simplices >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> K = B.n_skeleton(Integer(3)) >>> Q = B.quotient(K) >>> Q.subcomplex() Simplicial set with 4 non-degenerate simplices
- class sage.topology.simplicial_set_constructions.QuotientOfSimplicialSet_finite(inclusion, vertex_name='*')[source]#
Bases:
QuotientOfSimplicialSet
,PushoutOfSimplicialSets_finite
The quotient of finite simplicial sets.
When the simplicial sets involved are finite, there is a
quotient_map()
method available.- quotient_map()[source]#
Return the quotient map from the original simplicial set to the quotient.
EXAMPLES:
sage: K = simplicial_sets.Simplex(1) sage: S1 = K.quotient(K.n_skeleton(0)) sage: q = S1.quotient_map() sage: q Simplicial set morphism: From: 1-simplex To: Quotient: (1-simplex/Simplicial set with 2 non-degenerate simplices) Defn: [(0,), (1,), (0, 1)] --> [*, *, (0, 1)] sage: q.domain() == K True sage: q.codomain() == S1 True
>>> from sage.all import * >>> K = simplicial_sets.Simplex(Integer(1)) >>> S1 = K.quotient(K.n_skeleton(Integer(0))) >>> q = S1.quotient_map() >>> q Simplicial set morphism: From: 1-simplex To: Quotient: (1-simplex/Simplicial set with 2 non-degenerate simplices) Defn: [(0,), (1,), (0, 1)] --> [*, *, (0, 1)] >>> q.domain() == K True >>> q.codomain() == S1 True
- class sage.topology.simplicial_set_constructions.ReducedConeOfSimplicialSet(base)[source]#
Bases:
QuotientOfSimplicialSet
Return the reduced cone on a simplicial set.
INPUT:
base
– return the cone on this simplicial set.
Start with the unreduced cone: take
base
and add a point \(*\) (which will become the base point) and for each simplex \(\sigma\) inbase
, add both \(\sigma\) and a simplex made up of \(*\) and \(\sigma\) (topologically, form the join of \(*\) and \(\sigma\)).Now reduce: take the quotient by the 1-simplex connecting the old base point to the new one.
EXAMPLES:
sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet sage: v = AbstractSimplex(0, name='v') sage: e = AbstractSimplex(1, name='e') sage: X = SimplicialSet({e: (v, v)}) sage: X = X.set_base_point(v) sage: CX = X.cone() # indirect doctest sage: CX.nondegenerate_simplices() [*, e, (e,*)]
>>> from sage.all import * >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet >>> v = AbstractSimplex(Integer(0), name='v') >>> e = AbstractSimplex(Integer(1), name='e') >>> X = SimplicialSet({e: (v, v)}) >>> X = X.set_base_point(v) >>> CX = X.cone() # indirect doctest >>> CX.nondegenerate_simplices() [*, e, (e,*)]
- n_skeleton(n)[source]#
Return the \(n\)-skeleton of this simplicial set.
That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).
INPUT:
n
– the dimension
In the case when the cone is infinite, the \(n\)-skeleton of the cone is computed as the \(n\)-skeleton of the cone of the \(n\)-skeleton.
EXAMPLES:
sage: G = groups.misc.MultiplicativeAbelian([2]) # needs sage.groups sage: B = simplicial_sets.ClassifyingSpace(G) # needs sage.groups sage: B.cone().n_skeleton(3).homology() # needs sage.groups sage.modules {0: 0, 1: 0, 2: 0, 3: Z}
>>> from sage.all import * >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) # needs sage.groups >>> B = simplicial_sets.ClassifyingSpace(G) # needs sage.groups >>> B.cone().n_skeleton(Integer(3)).homology() # needs sage.groups sage.modules {0: 0, 1: 0, 2: 0, 3: Z}
- class sage.topology.simplicial_set_constructions.ReducedConeOfSimplicialSet_finite(base)[source]#
Bases:
ReducedConeOfSimplicialSet
,QuotientOfSimplicialSet_finite
Return the reduced cone on a simplicial set.
INPUT:
base
– return the cone on this simplicial set.
Start with the unreduced cone: take
base
and add a point \(*\) (which will become the base point) and for each simplex \(\sigma\) inbase
, add both \(\sigma\) and a simplex made up of \(*\) and \(\sigma\) (topologically, form the join of \(*\) and \(\sigma\)).Now reduce: take the quotient by the 1-simplex connecting the old base point to the new one.
EXAMPLES:
sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet sage: v = AbstractSimplex(0, name='v') sage: e = AbstractSimplex(1, name='e') sage: X = SimplicialSet({e: (v, v)}) sage: X = X.set_base_point(v) sage: CX = X.cone() # indirect doctest sage: CX.nondegenerate_simplices() [*, e, (e,*)]
>>> from sage.all import * >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet >>> v = AbstractSimplex(Integer(0), name='v') >>> e = AbstractSimplex(Integer(1), name='e') >>> X = SimplicialSet({e: (v, v)}) >>> X = X.set_base_point(v) >>> CX = X.cone() # indirect doctest >>> CX.nondegenerate_simplices() [*, e, (e,*)]
- map_from_base()[source]#
If this is the cone \(\tilde{C}X\) on \(X\), return the map from \(X\).
The map is defined to be the composite \(X \to CX \to \tilde{C}X\). This is used by the
SuspensionOfSimplicialSet_finite
class to construct the reduced suspension: take the quotient of the reduced cone by the image of \(X\) therein.EXAMPLES:
sage: S3 = simplicial_sets.Sphere(3) sage: CS3 = S3.cone() sage: CS3.map_from_base() Simplicial set morphism: From: S^3 To: Reduced cone of S^3 Defn: [v_0, sigma_3] --> [*, sigma_3]
>>> from sage.all import * >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> CS3 = S3.cone() >>> CS3.map_from_base() Simplicial set morphism: From: S^3 To: Reduced cone of S^3 Defn: [v_0, sigma_3] --> [*, sigma_3]
- class sage.topology.simplicial_set_constructions.SmashProductOfSimplicialSets_finite(factors=None)[source]#
Bases:
QuotientOfSimplicialSet_finite
,Factors
Return the smash product of finite pointed simplicial sets.
INPUT:
factors
– a list or tuple of simplicial sets
Return the smash product of the simplicial sets in
factors
: the smash product \(X \wedge Y\) is defined to be the quotient \((X \times Y) / (X \vee Y)\), where \(X \vee Y\) is the wedge sum.Each element of
factors
must be finite and pointed. (As of July 2016, constructing the wedge as a subcomplex of the product is only possible in Sage for finite simplicial sets.)EXAMPLES:
sage: T = simplicial_sets.Torus() sage: S2 = simplicial_sets.Sphere(2) sage: T.smash_product(S2).homology() == T.suspension(2).homology() # needs sage.modules True
>>> from sage.all import * >>> T = simplicial_sets.Torus() >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> T.smash_product(S2).homology() == T.suspension(Integer(2)).homology() # needs sage.modules True
- class sage.topology.simplicial_set_constructions.SubSimplicialSet(data, ambient=None)[source]#
Bases:
SimplicialSet_finite
,UniqueRepresentation
Return a finite simplicial set as a subsimplicial set of another simplicial set.
This keeps track of the ambient simplicial set and the inclusion map from the subcomplex into it.
INPUT:
data
– the data defining the subset: a dictionary where the keys are simplices from the ambient simplicial set and the values are their faces.ambient
– the ambient simplicial set. If omitted, use the same simplicial set as the subset and the ambient complex.
EXAMPLES:
sage: S3 = simplicial_sets.Sphere(3) sage: K = simplicial_sets.KleinBottle() sage: X = S3.disjoint_union(K) sage: Y = X.structure_map(0).image() # the S3 summand sage: Y.inclusion_map() Simplicial set morphism: From: Simplicial set with 2 non-degenerate simplices To: Disjoint union: (S^3 u Klein bottle) Defn: [v_0, sigma_3] --> [v_0, sigma_3] sage: Y.ambient_space() Disjoint union: (S^3 u Klein bottle)
>>> from sage.all import * >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> K = simplicial_sets.KleinBottle() >>> X = S3.disjoint_union(K) >>> Y = X.structure_map(Integer(0)).image() # the S3 summand >>> Y.inclusion_map() Simplicial set morphism: From: Simplicial set with 2 non-degenerate simplices To: Disjoint union: (S^3 u Klein bottle) Defn: [v_0, sigma_3] --> [v_0, sigma_3] >>> Y.ambient_space() Disjoint union: (S^3 u Klein bottle)
- ambient_space()[source]#
Return the simplicial set of which this is a subsimplicial set.
EXAMPLES:
sage: T = simplicial_sets.Torus() sage: eight = T.wedge_as_subset() sage: eight Simplicial set with 3 non-degenerate simplices sage: eight.fundamental_group() # needs sage.groups Finitely presented group < e0, e1 | > sage: eight.ambient_space() Torus
>>> from sage.all import * >>> T = simplicial_sets.Torus() >>> eight = T.wedge_as_subset() >>> eight Simplicial set with 3 non-degenerate simplices >>> eight.fundamental_group() # needs sage.groups Finitely presented group < e0, e1 | > >>> eight.ambient_space() Torus
- inclusion_map()[source]#
Return the inclusion map from this subsimplicial set into its ambient space.
EXAMPLES:
sage: RP6 = simplicial_sets.RealProjectiveSpace(6) # needs sage.groups sage: K = RP6.n_skeleton(2) # needs sage.groups sage: K.inclusion_map() # needs sage.groups Simplicial set morphism: From: Simplicial set with 3 non-degenerate simplices To: RP^6 Defn: [1, f, f * f] --> [1, f, f * f]
>>> from sage.all import * >>> RP6 = simplicial_sets.RealProjectiveSpace(Integer(6)) # needs sage.groups >>> K = RP6.n_skeleton(Integer(2)) # needs sage.groups >>> K.inclusion_map() # needs sage.groups Simplicial set morphism: From: Simplicial set with 3 non-degenerate simplices To: RP^6 Defn: [1, f, f * f] --> [1, f, f * f]
\(RP^6\) itself is constructed as a subsimplicial set of \(RP^\infty\):
sage: latex(RP6.inclusion_map()) # needs sage.groups RP^{6} \to RP^{\infty}
>>> from sage.all import * >>> latex(RP6.inclusion_map()) # needs sage.groups RP^{6} \to RP^{\infty}
- class sage.topology.simplicial_set_constructions.SuspensionOfSimplicialSet(base)[source]#
Bases:
SimplicialSet_arbitrary
,UniqueRepresentation
Return the (reduced) suspension of a simplicial set.
INPUT:
base
– return the suspension of this simplicial set.
If this simplicial set
X=base
is not pointed, or if it is itself an unreduced suspension, return the unreduced suspension: the quotient \(CX/X\), where \(CX\) is the (ordinary, unreduced) cone on \(X\). If \(X\) is pointed, then use the reduced cone instead, and so return the reduced suspension.We use \(S\) to denote unreduced suspension, \(\Sigma\) for reduced suspension.
EXAMPLES:
sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: B.suspension() Sigma(Classifying space of Multiplicative Abelian group isomorphic to C2) sage: B.suspension().n_skeleton(3).homology() # needs sage.modules {0: 0, 1: 0, 2: C2, 3: 0}
>>> from sage.all import * >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> B.suspension() Sigma(Classifying space of Multiplicative Abelian group isomorphic to C2) >>> B.suspension().n_skeleton(Integer(3)).homology() # needs sage.modules {0: 0, 1: 0, 2: C2, 3: 0}
If
X
is finite, the suspension comes with a quotient map from the cone:sage: S3 = simplicial_sets.Sphere(3) sage: S4 = S3.suspension() sage: S4.quotient_map() Simplicial set morphism: From: Reduced cone of S^3 To: Sigma(S^3) Defn: [*, sigma_3, (sigma_3,*)] --> [*, s_2 s_1 s_0 *, (sigma_3,*)]
>>> from sage.all import * >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> S4 = S3.suspension() >>> S4.quotient_map() Simplicial set morphism: From: Reduced cone of S^3 To: Sigma(S^3) Defn: [*, sigma_3, (sigma_3,*)] --> [*, s_2 s_1 s_0 *, (sigma_3,*)]
- n_skeleton(n)[source]#
Return the \(n\)-skeleton of this simplicial set.
That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).
INPUT:
n
– the dimension
In the case when the suspension is infinite, the \(n\)-skeleton of the suspension is computed as the \(n\)-skeleton of the suspension of the \(n\)-skeleton.
EXAMPLES:
sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: SigmaB = B.suspension() sage: SigmaB.n_skeleton(4).homology(base_ring=GF(2)) # needs sage.modules {0: Vector space of dimension 0 over Finite Field of size 2, 1: Vector space of dimension 0 over Finite Field of size 2, 2: Vector space of dimension 1 over Finite Field of size 2, 3: Vector space of dimension 1 over Finite Field of size 2, 4: Vector space of dimension 1 over Finite Field of size 2}
>>> from sage.all import * >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> SigmaB = B.suspension() >>> SigmaB.n_skeleton(Integer(4)).homology(base_ring=GF(Integer(2))) # needs sage.modules {0: Vector space of dimension 0 over Finite Field of size 2, 1: Vector space of dimension 0 over Finite Field of size 2, 2: Vector space of dimension 1 over Finite Field of size 2, 3: Vector space of dimension 1 over Finite Field of size 2, 4: Vector space of dimension 1 over Finite Field of size 2}
- class sage.topology.simplicial_set_constructions.SuspensionOfSimplicialSet_finite(base)[source]#
Bases:
SuspensionOfSimplicialSet
,QuotientOfSimplicialSet_finite
The (reduced) suspension of a finite simplicial set.
See
SuspensionOfSimplicialSet
for more information.
- class sage.topology.simplicial_set_constructions.WedgeOfSimplicialSets(factors=None)[source]#
Bases:
PushoutOfSimplicialSets
,Factors
Return the wedge sum of pointed simplicial sets.
INPUT:
factors
– a list or tuple of simplicial sets
Return the wedge of the simplicial sets in
factors
: the wedge sum \(X \vee Y\) is formed by taking the disjoint union of \(X\) and \(Y\) and identifying their base points. In this construction, the new base point is renamed ‘*’.The wedge comes equipped with maps to and from each factor, or actually, maps from each factor, and maps to simplicial sets isomorphic to each factor. The codomains of the latter maps are quotients of the wedge, not identical to the original factors.
EXAMPLES:
sage: CP2 = simplicial_sets.ComplexProjectiveSpace(2) sage: K = simplicial_sets.KleinBottle() sage: W = CP2.wedge(K) sage: W.homology() # needs sage.modules {0: 0, 1: Z x C2, 2: Z, 3: 0, 4: Z} sage: W.inclusion_map(1) Simplicial set morphism: From: Klein bottle To: Wedge: (CP^2 v Klein bottle) Defn: [Delta_{0,0}, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}] --> [*, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}] sage: W.projection_map(0).domain() Wedge: (CP^2 v Klein bottle) sage: W.projection_map(0).codomain() # copy of CP^2 Quotient: (Wedge: (CP^2 v Klein bottle)/Simplicial set with 6 non-degenerate simplices) sage: W.projection_map(0).codomain().homology() # needs sage.modules {0: 0, 1: 0, 2: Z, 3: 0, 4: Z}
>>> from sage.all import * >>> CP2 = simplicial_sets.ComplexProjectiveSpace(Integer(2)) >>> K = simplicial_sets.KleinBottle() >>> W = CP2.wedge(K) >>> W.homology() # needs sage.modules {0: 0, 1: Z x C2, 2: Z, 3: 0, 4: Z} >>> W.inclusion_map(Integer(1)) Simplicial set morphism: From: Klein bottle To: Wedge: (CP^2 v Klein bottle) Defn: [Delta_{0,0}, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}] --> [*, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}] >>> W.projection_map(Integer(0)).domain() Wedge: (CP^2 v Klein bottle) >>> W.projection_map(Integer(0)).codomain() # copy of CP^2 Quotient: (Wedge: (CP^2 v Klein bottle)/Simplicial set with 6 non-degenerate simplices) >>> W.projection_map(Integer(0)).codomain().homology() # needs sage.modules {0: 0, 1: 0, 2: Z, 3: 0, 4: Z}
An error occurs if any of the factors is not pointed:
sage: CP2.wedge(simplicial_sets.Simplex(1)) Traceback (most recent call last): ... ValueError: the simplicial sets must be pointed
>>> from sage.all import * >>> CP2.wedge(simplicial_sets.Simplex(Integer(1))) Traceback (most recent call last): ... ValueError: the simplicial sets must be pointed
- summand(i)[source]#
Return the \(i\)-th factor of this construction of simplicial sets.
INPUT:
i
– integer, the index of the factor
EXAMPLES:
sage: S2 = simplicial_sets.Sphere(2) sage: S3 = simplicial_sets.Sphere(3) sage: K = S2.disjoint_union(S3) sage: K.factor(0) S^2 sage: # needs sage.groups sage: G = groups.misc.MultiplicativeAbelian([2]) sage: B = simplicial_sets.ClassifyingSpace(G) sage: X = B.wedge(S3, B) sage: X.factor(1) S^3 sage: X.factor(2) Classifying space of Multiplicative Abelian group isomorphic to C2
>>> from sage.all import * >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> K = S2.disjoint_union(S3) >>> K.factor(Integer(0)) S^2 >>> # needs sage.groups >>> G = groups.misc.MultiplicativeAbelian([Integer(2)]) >>> B = simplicial_sets.ClassifyingSpace(G) >>> X = B.wedge(S3, B) >>> X.factor(Integer(1)) S^3 >>> X.factor(Integer(2)) Classifying space of Multiplicative Abelian group isomorphic to C2
- summands()[source]#
Return the factors involved in this construction of simplicial sets.
EXAMPLES:
sage: S2 = simplicial_sets.Sphere(2) sage: S3 = simplicial_sets.Sphere(3) sage: S2.wedge(S3).factors() == (S2, S3) True sage: S2.product(S3).factors()[0] S^2
>>> from sage.all import * >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> S2.wedge(S3).factors() == (S2, S3) True >>> S2.product(S3).factors()[Integer(0)] S^2
- class sage.topology.simplicial_set_constructions.WedgeOfSimplicialSets_finite(factors=None)[source]#
Bases:
WedgeOfSimplicialSets
,PushoutOfSimplicialSets_finite
The wedge sum of finite pointed simplicial sets.
- inclusion_map(i)[source]#
Return the inclusion map of the \(i\)-th factor.
EXAMPLES:
sage: S1 = simplicial_sets.Sphere(1) sage: S2 = simplicial_sets.Sphere(2) sage: W = S1.wedge(S2, S1) sage: W.inclusion_map(1) Simplicial set morphism: From: S^2 To: Wedge: (S^1 v S^2 v S^1) Defn: [v_0, sigma_2] --> [*, sigma_2] sage: W.inclusion_map(0).domain() S^1 sage: W.inclusion_map(2).domain() S^1
>>> from sage.all import * >>> S1 = simplicial_sets.Sphere(Integer(1)) >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> W = S1.wedge(S2, S1) >>> W.inclusion_map(Integer(1)) Simplicial set morphism: From: S^2 To: Wedge: (S^1 v S^2 v S^1) Defn: [v_0, sigma_2] --> [*, sigma_2] >>> W.inclusion_map(Integer(0)).domain() S^1 >>> W.inclusion_map(Integer(2)).domain() S^1
- projection_map(i)[source]#
Return the projection map onto the \(i\)-th factor.
EXAMPLES:
sage: S1 = simplicial_sets.Sphere(1) sage: S2 = simplicial_sets.Sphere(2) sage: W = S1.wedge(S2, S1) sage: W.projection_map(1) Simplicial set morphism: From: Wedge: (S^1 v S^2 v S^1) To: Quotient: (Wedge: (S^1 v S^2 v S^1)/Simplicial set with 3 non-degenerate simplices) Defn: [*, sigma_1, sigma_1, sigma_2] --> [*, s_0 *, s_0 *, sigma_2] sage: W.projection_map(1).image().homology(1) # needs sage.modules 0 sage: W.projection_map(1).image().homology(2) # needs sage.modules Z
>>> from sage.all import * >>> S1 = simplicial_sets.Sphere(Integer(1)) >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> W = S1.wedge(S2, S1) >>> W.projection_map(Integer(1)) Simplicial set morphism: From: Wedge: (S^1 v S^2 v S^1) To: Quotient: (Wedge: (S^1 v S^2 v S^1)/Simplicial set with 3 non-degenerate simplices) Defn: [*, sigma_1, sigma_1, sigma_2] --> [*, s_0 *, s_0 *, sigma_2] >>> W.projection_map(Integer(1)).image().homology(Integer(1)) # needs sage.modules 0 >>> W.projection_map(Integer(1)).image().homology(Integer(2)) # needs sage.modules Z