Simplicial Sets#

class sage.categories.simplicial_sets.SimplicialSets(s=None)#

Bases: Category_singleton

The category of simplicial sets.

A simplicial set \(X\) is a collection of sets \(X_i\), indexed by the non-negative integers, together with maps

\[\begin{split}d_i: X_n \to X_{n-1}, \quad 0 \leq i \leq n \quad \text{(face maps)} \\ s_j: X_n \to X_{n+1}, \quad 0 \leq j \leq n \quad \text{(degeneracy maps)}\end{split}\]

satisfying the simplicial identities:

\[\begin{split}d_i d_j &= d_{j-1} d_i \quad \text{if } i<j \\ d_i s_j &= s_{j-1} d_i \quad \text{if } i<j \\ d_j s_j &= 1 = d_{j+1} s_j \\ d_i s_j &= s_{j} d_{i-1} \quad \text{if } i>j+1 \\ s_i s_j &= s_{j+1} s_{i} \quad \text{if } i \leq j\end{split}\]

Morphisms are sequences of maps \(f_i : X_i \to Y_i\) which commute with the face and degeneracy maps.

EXAMPLES:

sage: from sage.categories.simplicial_sets import SimplicialSets
sage: C = SimplicialSets(); C
Category of simplicial sets
class Finite(base_category)#

Bases: CategoryWithAxiom

Category of finite simplicial sets.

The objects are simplicial sets with finitely many non-degenerate simplices.

class Homsets(category, *args)#

Bases: HomsetsCategory

class Endset(base_category)#

Bases: CategoryWithAxiom

class ParentMethods#

Bases: object

one()#

Return the identity morphism in \(\operatorname{Hom}(S, S)\).

EXAMPLES:

sage: T = simplicial_sets.Torus()                               # optional - sage.graphs
sage: Hom(T, T).identity()                                      # optional - sage.graphs
Simplicial set endomorphism of Torus
  Defn: Identity map
class ParentMethods#

Bases: object

is_finite()#

Return True if this simplicial set is finite, i.e., has a finite number of nondegenerate simplices.

EXAMPLES:

sage: simplicial_sets.Torus().is_finite()                               # optional - sage.graphs
True
sage: C5 = groups.misc.MultiplicativeAbelian([5])                       # optional - sage.graphs sage.groups
sage: simplicial_sets.ClassifyingSpace(C5).is_finite()                  # optional - sage.graphs sage.groups
False
is_pointed()#

Return True if this simplicial set is pointed, i.e., has a base point.

EXAMPLES:

sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet       # optional - sage.graphs
sage: v = AbstractSimplex(0)                                            # optional - sage.graphs
sage: w = AbstractSimplex(0)                                            # optional - sage.graphs
sage: e = AbstractSimplex(1)                                            # optional - sage.graphs
sage: X = SimplicialSet({e: (v, w)})                                    # optional - sage.graphs
sage: Y = SimplicialSet({e: (v, w)}, base_point=w)                      # optional - sage.graphs
sage: X.is_pointed()                                                    # optional - sage.graphs
False
sage: Y.is_pointed()                                                    # optional - sage.graphs
True
set_base_point(point)#

Return a copy of this simplicial set in which the base point is set to point.

INPUT:

  • point – a 0-simplex in this simplicial set

EXAMPLES:

sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet       # optional - sage.graphs
sage: v = AbstractSimplex(0, name='v_0')                                # optional - sage.graphs
sage: w = AbstractSimplex(0, name='w_0')                                # optional - sage.graphs
sage: e = AbstractSimplex(1)                                            # optional - sage.graphs
sage: X = SimplicialSet({e: (v, w)})                                    # optional - sage.graphs
sage: Y = SimplicialSet({e: (v, w)}, base_point=w)                      # optional - sage.graphs
sage: Y.base_point()                                                    # optional - sage.graphs
w_0
sage: X_star = X.set_base_point(w)                                      # optional - sage.graphs
sage: X_star.base_point()                                               # optional - sage.graphs
w_0
sage: Y_star = Y.set_base_point(v)                                      # optional - sage.graphs
sage: Y_star.base_point()                                               # optional - sage.graphs
v_0
class Pointed(base_category)#

Bases: CategoryWithAxiom

class Finite(base_category)#

Bases: CategoryWithAxiom

class ParentMethods#

Bases: object

fat_wedge(n)#

Return the \(n\)-th fat wedge of this pointed simplicial set.

This is the subcomplex of the \(n\)-fold product \(X^n\) consisting of those points in which at least one factor is the base point. Thus when \(n=2\), this is the wedge of the simplicial set with itself, but when \(n\) is larger, the fat wedge is larger than the \(n\)-fold wedge.

EXAMPLES:

sage: S1 = simplicial_sets.Sphere(1)                            # optional - sage.graphs
sage: S1.fat_wedge(0)                                           # optional - sage.graphs
Point
sage: S1.fat_wedge(1)                                           # optional - sage.graphs
S^1
sage: S1.fat_wedge(2).fundamental_group()                       # optional - sage.graphs sage.groups
Finitely presented group < e0, e1 |  >
sage: S1.fat_wedge(4).homology()                                # optional - sage.graphs sage.modules
{0: 0, 1: Z x Z x Z x Z, 2: Z^6, 3: Z x Z x Z x Z}
smash_product(*others)#

Return the smash product of this simplicial set with others.

INPUT:

  • others – one or several simplicial sets

EXAMPLES:

sage: S1 = simplicial_sets.Sphere(1)                            # optional - sage.graphs
sage: RP2 = simplicial_sets.RealProjectiveSpace(2)              # optional - sage.graphs sage.groups
sage: X = S1.smash_product(RP2)                                 # optional - sage.graphs sage.groups
sage: X.homology(base_ring=GF(2))                               # optional - sage.graphs sage.groups sage.modules sage.rings.finite_rings
{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}

sage: T = S1.product(S1)                                        # optional - sage.graphs
sage: X = T.smash_product(S1)                                   # optional - sage.graphs
sage: X.homology(reduced=False)                                 # optional - sage.graphs sage.modules
{0: Z, 1: 0, 2: Z x Z, 3: Z}
unset_base_point()#

Return a copy of this simplicial set in which the base point has been forgotten.

EXAMPLES:

sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet                   # optional - sage.graphs
sage: v = AbstractSimplex(0, name='v_0')                        # optional - sage.graphs
sage: w = AbstractSimplex(0, name='w_0')                        # optional - sage.graphs
sage: e = AbstractSimplex(1)                                    # optional - sage.graphs
sage: Y = SimplicialSet({e: (v, w)}, base_point=w)              # optional - sage.graphs
sage: Y.is_pointed()                                            # optional - sage.graphs
True
sage: Y.base_point()                                            # optional - sage.graphs
w_0
sage: Z = Y.unset_base_point()                                  # optional - sage.graphs
sage: Z.is_pointed()                                            # optional - sage.graphs
False
class ParentMethods#

Bases: object

base_point()#

Return this simplicial set’s base point

EXAMPLES:

sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet   # optional - sage.graphs
sage: v = AbstractSimplex(0, name='*')                              # optional - sage.graphs
sage: e = AbstractSimplex(1)                                        # optional - sage.graphs
sage: S1 = SimplicialSet({e: (v, v)}, base_point=v)                 # optional - sage.graphs
sage: S1.is_pointed()                                               # optional - sage.graphs
True
sage: S1.base_point()                                               # optional - sage.graphs
*
base_point_map(domain=None)#

Return a map from a one-point space to this one, with image the base point.

This raises an error if this simplicial set does not have a base point.

INPUT:

  • domain – optional, default None. Use this to specify a particular one-point space as the domain. The default behavior is to use the sage.topology.simplicial_set.Point() function to use a standard one-point space.

EXAMPLES:

sage: T = simplicial_sets.Torus()                                   # optional - sage.graphs
sage: f = T.base_point_map(); f                                     # optional - sage.graphs
Simplicial set morphism:
  From: Point
  To:   Torus
  Defn: Constant map at (v_0, v_0)
sage: S3 = simplicial_sets.Sphere(3)                                # optional - sage.graphs
sage: g = S3.base_point_map()                                       # optional - sage.graphs
sage: f.domain() == g.domain()                                      # optional - sage.graphs
True
sage: RP3 = simplicial_sets.RealProjectiveSpace(3)                  # optional - sage.graphs sage.groups
sage: temp = simplicial_sets.Simplex(0)                             # optional - sage.graphs sage.groups
sage: pt = temp.set_base_point(temp.n_cells(0)[0])                  # optional - sage.graphs sage.groups
sage: h = RP3.base_point_map(domain=pt)                             # optional - sage.graphs sage.groups
sage: f.domain() == h.domain()                                      # optional - sage.graphs sage.groups
False

sage: C5 = groups.misc.MultiplicativeAbelian([5])                   # optional - sage.graphs sage.groups
sage: BC5 = simplicial_sets.ClassifyingSpace(C5)                    # optional - sage.graphs sage.groups
sage: BC5.base_point_map()                                          # optional - sage.graphs sage.groups
Simplicial set morphism:
  From: Point
  To:   Classifying space of Multiplicative Abelian group isomorphic to C5
  Defn: Constant map at 1
connectivity(max_dim=None)#

Return the connectivity of this pointed simplicial set.

INPUT:

  • max_dim – specify a maximum dimension through which to check. This is required if this simplicial set is simply connected and not finite.

The dimension of the first nonzero homotopy group. If simply connected, this is the same as the dimension of the first nonzero homology group.

Warning

See the warning for the is_simply_connected() method.

The connectivity of a contractible space is +Infinity.

EXAMPLES:

sage: simplicial_sets.Sphere(3).connectivity()                      # optional - sage.graphs sage.groups
2
sage: simplicial_sets.Sphere(0).connectivity()                      # optional - sage.graphs sage.groups
-1
sage: K = simplicial_sets.Simplex(4)                                # optional - sage.graphs
sage: K = K.set_base_point(K.n_cells(0)[0])                         # optional - sage.graphs
sage: K.connectivity()                                              # optional - sage.graphs sage.groups
+Infinity
sage: X = simplicial_sets.Torus().suspension(2)                     # optional - sage.graphs
sage: X.connectivity()                                              # optional - sage.graphs sage.groups
2

sage: C2 = groups.misc.MultiplicativeAbelian([2])                   # optional - sage.graphs sage.groups
sage: BC2 = simplicial_sets.ClassifyingSpace(C2)                    # optional - sage.graphs sage.groups
sage: BC2.connectivity()                                            # optional - sage.graphs sage.groups
0
cover(character)#

Return the cover of the simplicial set associated to a character of the fundamental group.

The character is represented by a dictionary, that assigns an element of a finite group to each nondegenerate 1-dimensional cell. It should correspond to an epimorphism from the fundamental group.

INPUT:

  • character – a dictionary

EXAMPLES:

sage: S1 = simplicial_sets.Sphere(1)                                # optional - sage.graphs
sage: W = S1.wedge(S1)                                              # optional - sage.graphs
sage: G = CyclicPermutationGroup(3)                                 # optional - sage.groups
sage: (a, b) = W.n_cells(1)                                         # optional - sage.graphs
sage: C = W.cover({a : G.gen(0), b : G.gen(0)^2})                   # optional - sage.graphs sage.groups
sage: C.face_data()                                                 # optional - sage.graphs sage.groups
{(*, ()): None,
 (*, (1,2,3)): None,
 (*, (1,3,2)): None,
 (sigma_1, ()): ((*, (1,2,3)), (*, ())),
 (sigma_1, ()): ((*, (1,3,2)), (*, ())),
 (sigma_1, (1,2,3)): ((*, (1,3,2)), (*, (1,2,3))),
 (sigma_1, (1,2,3)): ((*, ()), (*, (1,2,3))),
 (sigma_1, (1,3,2)): ((*, ()), (*, (1,3,2))),
 (sigma_1, (1,3,2)): ((*, (1,2,3)), (*, (1,3,2)))}
sage: C.homology(1)                                                 # optional - sage.graphs sage.groups sage.modules
Z x Z x Z x Z
sage: C.fundamental_group()                                         # optional - sage.graphs sage.groups
Finitely presented group < e0, e1, e2, e3 |  >
covering_map(character)#

Return the covering map associated to a character.

The character is represented by a dictionary that assigns an element of a finite group to each nondegenerate 1-dimensional cell. It should correspond to an epimorphism from the fundamental group.

INPUT:

  • character – a dictionary

EXAMPLES:

sage: S1 = simplicial_sets.Sphere(1)                                # optional - sage.graphs
sage: W = S1.wedge(S1)                                              # optional - sage.graphs
sage: G = CyclicPermutationGroup(3)                                 # optional - sage.groups
sage: a, b = W.n_cells(1)                                           # optional - sage.graphs
sage: C = W.covering_map({a : G.gen(0), b : G.one()}); C            # optional - sage.graphs sage.groups
Simplicial set morphism:
  From: Simplicial set with 9 non-degenerate simplices
  To:   Wedge: (S^1 v S^1)
  Defn: [(*, ()), (*, (1,2,3)), (*, (1,3,2)), (sigma_1, ()),
         (sigma_1, ()), (sigma_1, (1,2,3)), (sigma_1, (1,2,3)),
         (sigma_1, (1,3,2)), (sigma_1, (1,3,2))]
        --> [*, *, *, sigma_1, sigma_1, sigma_1, sigma_1, sigma_1, sigma_1]
sage: C.domain()                                                    # optional - sage.graphs sage.groups
Simplicial set with 9 non-degenerate simplices
sage: C.domain().face_data()                                        # optional - sage.graphs sage.groups
{(*, ()): None,
 (*, (1,2,3)): None,
 (*, (1,3,2)): None,
 (sigma_1, ()): ((*, (1,2,3)), (*, ())),
 (sigma_1, ()): ((*, ()), (*, ())),
 (sigma_1, (1,2,3)): ((*, (1,3,2)), (*, (1,2,3))),
 (sigma_1, (1,2,3)): ((*, (1,2,3)), (*, (1,2,3))),
 (sigma_1, (1,3,2)): ((*, ()), (*, (1,3,2))),
 (sigma_1, (1,3,2)): ((*, (1,3,2)), (*, (1,3,2)))}
fundamental_group(simplify=True)#

Return the fundamental group of this pointed simplicial set.

INPUT:

  • simplify (bool, optional True) – if False, then return a presentation of the group in terms of generators and relations. If True, the default, simplify as much as GAP is able to.

Algorithm: we compute the edge-path group – see Section 19 of [Kan1958] and Wikipedia article Fundamental_group. Choose a spanning tree for the connected component of the 1-skeleton containing the base point, and then the group’s generators are given by the non-degenerate edges. There are two types of relations: \(e=1\) if \(e\) is in the spanning tree, and for every 2-simplex, if its faces are \(e_0\), \(e_1\), and \(e_2\), then we impose the relation \(e_0 e_1^{-1} e_2 = 1\), where we first set \(e_i=1\) if \(e_i\) is degenerate.

EXAMPLES:

sage: S1 = simplicial_sets.Sphere(1)                                # optional - sage.graphs
sage: eight = S1.wedge(S1)                                          # optional - sage.graphs
sage: eight.fundamental_group() # free group on 2 generators        # optional - sage.graphs sage.groups
Finitely presented group < e0, e1 |  >

The fundamental group of a disjoint union of course depends on the choice of base point:

sage: T = simplicial_sets.Torus()                                   # optional - sage.graphs
sage: K = simplicial_sets.KleinBottle()                             # optional - sage.graphs
sage: X = T.disjoint_union(K)                                       # optional - sage.graphs

sage: X_0 = X.set_base_point(X.n_cells(0)[0])                       # optional - sage.graphs
sage: X_0.fundamental_group().is_abelian()                          # optional - sage.graphs sage.groups
True
sage: X_1 = X.set_base_point(X.n_cells(0)[1])                       # optional - sage.graphs
sage: X_1.fundamental_group().is_abelian()                          # optional - sage.graphs sage.groups
False

sage: RP3 = simplicial_sets.RealProjectiveSpace(3)                  # optional - sage.graphs sage.groups
sage: RP3.fundamental_group()                                       # optional - sage.graphs sage.groups
Finitely presented group < e | e^2 >

Compute the fundamental group of some classifying spaces:

sage: C5 = groups.misc.MultiplicativeAbelian([5])                   # optional - sage.graphs sage.groups
sage: BC5 = C5.nerve()                                              # optional - sage.graphs sage.groups
sage: BC5.fundamental_group()                                       # optional - sage.graphs sage.groups
Finitely presented group < e0 | e0^5 >

sage: Sigma3 = groups.permutation.Symmetric(3)                      # optional - sage.graphs sage.groups
sage: BSigma3 = Sigma3.nerve()                                      # optional - sage.graphs sage.groups
sage: pi = BSigma3.fundamental_group(); pi                          # optional - sage.graphs sage.groups
Finitely presented group < e1, e2 | e2^2, e1^3, (e2*e1)^2 >
sage: pi.order()                                                    # optional - sage.graphs sage.groups
6
sage: pi.is_abelian()                                               # optional - sage.graphs sage.groups
False

The sphere has a trivial fundamental group:

sage: S2 = simplicial_sets.Sphere(2)                                # optional - sage.graphs
sage: S2.fundamental_group()                                        # optional - sage.graphs sage.groups
Finitely presented group <  |  >
is_simply_connected()#

Return True if this pointed simplicial set is simply connected.

Warning

Determining simple connectivity is not always possible, because it requires determining when a group, as given by generators and relations, is trivial. So this conceivably may give a false negative in some cases.

EXAMPLES:

sage: T = simplicial_sets.Torus()                                   # optional - sage.graphs
sage: T.is_simply_connected()                                       # optional - sage.graphs sage.groups
False
sage: T.suspension().is_simply_connected()                          # optional - sage.graphs sage.groups
True
sage: simplicial_sets.KleinBottle().is_simply_connected()           # optional - sage.graphs sage.groups
False

sage: S2 = simplicial_sets.Sphere(2)                                # optional - sage.graphs
sage: S3 = simplicial_sets.Sphere(3)                                # optional - sage.graphs
sage: (S2.wedge(S3)).is_simply_connected()                          # optional - sage.graphs sage.groups
True
sage: X = S2.disjoint_union(S3)                                     # optional - sage.graphs
sage: X = X.set_base_point(X.n_cells(0)[0])                         # optional - sage.graphs
sage: X.is_simply_connected()                                       # optional - sage.graphs sage.groups
False

sage: C3 = groups.misc.MultiplicativeAbelian([3])                   # optional - sage.graphs sage.groups
sage: BC3 = simplicial_sets.ClassifyingSpace(C3)                    # optional - sage.graphs sage.groups
sage: BC3.is_simply_connected()                                     # optional - sage.graphs sage.groups
False
universal_cover()#

Return the universal cover of the simplicial set. The fundamental group must be finite in order to ensure that the universal cover is a simplicial set of finite type.

EXAMPLES:

sage: RP3 = simplicial_sets.RealProjectiveSpace(3)                  # optional - sage.groups
sage: C = RP3.universal_cover(); C                                  # optional - sage.groups
Simplicial set with 8 non-degenerate simplices
sage: C.face_data()                                                 # optional - sage.groups
{(1, 1): None,
 (1, e): None,
 (f, 1): ((1, e), (1, 1)),
 (f, e): ((1, 1), (1, e)),
 (f * f, 1): ((f, e), s_0 (1, 1), (f, 1)),
 (f * f, e): ((f, 1), s_0 (1, e), (f, e)),
 (f * f * f, 1): ((f * f, e), s_0 (f, 1), s_1 (f, 1), (f * f, 1)),
 (f * f * f, e): ((f * f, 1), s_0 (f, e), s_1 (f, e), (f * f, e))}
sage: C.fundamental_group()                                         # optional - sage.groups
Finitely presented group <  |  >
universal_cover_map()#

Return the universal covering map of the simplicial set.

It requires the fundamental group to be finite.

EXAMPLES:

sage: RP2 = simplicial_sets.RealProjectiveSpace(2)                  # optional - sage.groups
sage: phi = RP2.universal_cover_map(); phi                          # optional - sage.groups
Simplicial set morphism:
  From: Simplicial set with 6 non-degenerate simplices
  To:   RP^2
  Defn: [(1, 1), (1, e), (f, 1), (f, e), (f * f, 1), (f * f, e)]
        --> [1, 1, f, f, f * f, f * f]
sage: phi.domain().face_data()                                      # optional - sage.groups
    {(1, 1): None,
     (1, e): None,
     (f, 1): ((1, e), (1, 1)),
     (f, e): ((1, 1), (1, e)),
     (f * f, 1): ((f, e), s_0 (1, 1), (f, 1)),
     (f * f, e): ((f, 1), s_0 (1, e), (f, e))}
class SubcategoryMethods#

Bases: object

Pointed()#

A simplicial set is pointed if it has a distinguished base point.

EXAMPLES:

sage: from sage.categories.simplicial_sets import SimplicialSets
sage: SimplicialSets().Pointed().Finite()
Category of finite pointed simplicial sets
sage: SimplicialSets().Finite().Pointed()
Category of finite pointed simplicial sets
super_categories()#

EXAMPLES:

sage: from sage.categories.simplicial_sets import SimplicialSets
sage: SimplicialSets().super_categories()
[Category of sets]