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 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 – 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 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, optional (default False)

If as_subset is 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_subset is 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 – 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() 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 – a list or tuple of morphisms of simplicial sets

  • vertex_name – optional, 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_name is None, generate the name of the base point automatically; otherwise, use vertex_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() 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 – 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\) 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 base and 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_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