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– 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 - _factorsattribute for their instances, and this class accesses that attribute. This is used by- ProductOfSimplicialSets,- WedgeOfSimplicialSets, and- DisjointUnionOfSimplicialSets.- 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– 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) - squareis 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 - S1is pointed, so is- T:- 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 factor
- as_subset– boolean (default:- False)
 - If - as_subsetis- True, 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_subsetis- False, 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(), and- fat_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– 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()and- universal_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– list or tuple of morphisms of simplicial sets
- vertex_name– (default:- None)
 - 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_nameis- None, generate the name of the base point automatically; otherwise, use- vertex_namefor 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()and- universal_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 set
- vertex_name– string (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 - baseand 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\)).- 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 - baseand 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\)).- 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_finiteclass 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– 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 - factorsmust 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=baseis 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 - Xis 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 - SuspensionOfSimplicialSetfor 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– 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