Simplicial Sets#
- class sage.categories.simplicial_sets.SimplicialSets[source]#
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
>>> from sage.all import * >>> from sage.categories.simplicial_sets import SimplicialSets >>> C = SimplicialSets(); C Category of simplicial sets
- class Finite(base_category)[source]#
Bases:
CategoryWithAxiom
Category of finite simplicial sets.
The objects are simplicial sets with finitely many non-degenerate simplices.
- class Homsets(category, *args)[source]#
Bases:
HomsetsCategory
- class Endset(base_category)[source]#
Bases:
CategoryWithAxiom
- class ParentMethods[source]#
Bases:
object
- one()[source]#
Return the identity morphism in \(\operatorname{Hom}(S, S)\).
EXAMPLES:
sage: T = simplicial_sets.Torus() # needs sage.graphs sage: Hom(T, T).identity() # needs sage.graphs Simplicial set endomorphism of Torus Defn: Identity map
>>> from sage.all import * >>> T = simplicial_sets.Torus() # needs sage.graphs >>> Hom(T, T).identity() # needs sage.graphs Simplicial set endomorphism of Torus Defn: Identity map
- class ParentMethods[source]#
Bases:
object
- is_finite()[source]#
Return
True
if this simplicial set is finite, i.e., has a finite number of nondegenerate simplices.EXAMPLES:
sage: simplicial_sets.Torus().is_finite() # needs sage.graphs True sage: C5 = groups.misc.MultiplicativeAbelian([5]) # needs sage.graphs sage.groups sage: simplicial_sets.ClassifyingSpace(C5).is_finite() # needs sage.graphs sage.groups False
>>> from sage.all import * >>> simplicial_sets.Torus().is_finite() # needs sage.graphs True >>> C5 = groups.misc.MultiplicativeAbelian([Integer(5)]) # needs sage.graphs sage.groups >>> simplicial_sets.ClassifyingSpace(C5).is_finite() # needs sage.graphs sage.groups False
- is_pointed()[source]#
Return
True
if this simplicial set is pointed, i.e., has a base point.EXAMPLES:
sage: # needs sage.graphs sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet sage: v = AbstractSimplex(0) sage: w = AbstractSimplex(0) sage: e = AbstractSimplex(1) sage: X = SimplicialSet({e: (v, w)}) sage: Y = SimplicialSet({e: (v, w)}, base_point=w) sage: X.is_pointed() False sage: Y.is_pointed() True
>>> from sage.all import * >>> # needs sage.graphs >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet >>> v = AbstractSimplex(Integer(0)) >>> w = AbstractSimplex(Integer(0)) >>> e = AbstractSimplex(Integer(1)) >>> X = SimplicialSet({e: (v, w)}) >>> Y = SimplicialSet({e: (v, w)}, base_point=w) >>> X.is_pointed() False >>> Y.is_pointed() True
- set_base_point(point)[source]#
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: # needs sage.graphs sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet sage: v = AbstractSimplex(0, name='v_0') sage: w = AbstractSimplex(0, name='w_0') sage: e = AbstractSimplex(1) sage: X = SimplicialSet({e: (v, w)}) sage: Y = SimplicialSet({e: (v, w)}, base_point=w) sage: Y.base_point() w_0 sage: X_star = X.set_base_point(w) sage: X_star.base_point() w_0 sage: Y_star = Y.set_base_point(v) sage: Y_star.base_point() v_0
>>> from sage.all import * >>> # needs sage.graphs >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet >>> v = AbstractSimplex(Integer(0), name='v_0') >>> w = AbstractSimplex(Integer(0), name='w_0') >>> e = AbstractSimplex(Integer(1)) >>> X = SimplicialSet({e: (v, w)}) >>> Y = SimplicialSet({e: (v, w)}, base_point=w) >>> Y.base_point() w_0 >>> X_star = X.set_base_point(w) >>> X_star.base_point() w_0 >>> Y_star = Y.set_base_point(v) >>> Y_star.base_point() v_0
- class Pointed(base_category)[source]#
Bases:
CategoryWithAxiom
- class Finite(base_category)[source]#
Bases:
CategoryWithAxiom
- class ParentMethods[source]#
Bases:
object
- fat_wedge(n)[source]#
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: # needs sage.graphs sage: S1 = simplicial_sets.Sphere(1) sage: S1.fat_wedge(0) Point sage: S1.fat_wedge(1) S^1 sage: S1.fat_wedge(2).fundamental_group() # needs sage.groups Finitely presented group < e0, e1 | > sage: S1.fat_wedge(4).homology() # needs sage.modules {0: 0, 1: Z x Z x Z x Z, 2: Z^6, 3: Z x Z x Z x Z}
>>> from sage.all import * >>> # needs sage.graphs >>> S1 = simplicial_sets.Sphere(Integer(1)) >>> S1.fat_wedge(Integer(0)) Point >>> S1.fat_wedge(Integer(1)) S^1 >>> S1.fat_wedge(Integer(2)).fundamental_group() # needs sage.groups Finitely presented group < e0, e1 | > >>> S1.fat_wedge(Integer(4)).homology() # needs 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)[source]#
Return the smash product of this simplicial set with
others
.INPUT:
others
– one or several simplicial sets
EXAMPLES:
sage: # needs sage.graphs sage.groups sage: S1 = simplicial_sets.Sphere(1) sage: RP2 = simplicial_sets.RealProjectiveSpace(2) sage: X = S1.smash_product(RP2) sage: X.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} sage: T = S1.product(S1) # needs sage.graphs sage.groups sage: X = T.smash_product(S1) # needs sage.graphs sage.groups sage: X.homology(reduced=False) # needs sage.graphs sage.groups sage.modules {0: Z, 1: 0, 2: Z x Z, 3: Z}
>>> from sage.all import * >>> # needs sage.graphs sage.groups >>> S1 = simplicial_sets.Sphere(Integer(1)) >>> RP2 = simplicial_sets.RealProjectiveSpace(Integer(2)) >>> X = S1.smash_product(RP2) >>> X.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} >>> T = S1.product(S1) # needs sage.graphs sage.groups >>> X = T.smash_product(S1) # needs sage.graphs sage.groups >>> X.homology(reduced=False) # needs sage.graphs sage.groups sage.modules {0: Z, 1: 0, 2: Z x Z, 3: Z}
- unset_base_point()[source]#
Return a copy of this simplicial set in which the base point has been forgotten.
EXAMPLES:
sage: # needs sage.graphs sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet sage: v = AbstractSimplex(0, name='v_0') sage: w = AbstractSimplex(0, name='w_0') sage: e = AbstractSimplex(1) sage: Y = SimplicialSet({e: (v, w)}, base_point=w) sage: Y.is_pointed() True sage: Y.base_point() w_0 sage: Z = Y.unset_base_point() sage: Z.is_pointed() False
>>> from sage.all import * >>> # needs sage.graphs >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet >>> v = AbstractSimplex(Integer(0), name='v_0') >>> w = AbstractSimplex(Integer(0), name='w_0') >>> e = AbstractSimplex(Integer(1)) >>> Y = SimplicialSet({e: (v, w)}, base_point=w) >>> Y.is_pointed() True >>> Y.base_point() w_0 >>> Z = Y.unset_base_point() >>> Z.is_pointed() False
- class ParentMethods[source]#
Bases:
object
- base_point()[source]#
Return this simplicial set’s base point
EXAMPLES:
sage: # needs sage.graphs sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet sage: v = AbstractSimplex(0, name='*') sage: e = AbstractSimplex(1) sage: S1 = SimplicialSet({e: (v, v)}, base_point=v) sage: S1.is_pointed() True sage: S1.base_point() *
>>> from sage.all import * >>> # needs sage.graphs >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet >>> v = AbstractSimplex(Integer(0), name='*') >>> e = AbstractSimplex(Integer(1)) >>> S1 = SimplicialSet({e: (v, v)}, base_point=v) >>> S1.is_pointed() True >>> S1.base_point() *
- base_point_map(domain=None)[source]#
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, defaultNone
. Use this to specify a particular one-point space as the domain. The default behavior is to use thesage.topology.simplicial_set.Point()
function to use a standard one-point space.
EXAMPLES:
sage: # needs sage.graphs sage: T = simplicial_sets.Torus() sage: f = T.base_point_map(); f Simplicial set morphism: From: Point To: Torus Defn: Constant map at (v_0, v_0) sage: S3 = simplicial_sets.Sphere(3) sage: g = S3.base_point_map() sage: f.domain() == g.domain() True sage: RP3 = simplicial_sets.RealProjectiveSpace(3) # needs sage.groups sage: temp = simplicial_sets.Simplex(0) sage: pt = temp.set_base_point(temp.n_cells(0)[0]) sage: h = RP3.base_point_map(domain=pt) # needs sage.groups sage: f.domain() == h.domain() # needs sage.groups False sage: C5 = groups.misc.MultiplicativeAbelian([5]) # needs sage.graphs sage.groups sage: BC5 = simplicial_sets.ClassifyingSpace(C5) # needs sage.graphs sage.groups sage: BC5.base_point_map() # needs sage.graphs sage.groups Simplicial set morphism: From: Point To: Classifying space of Multiplicative Abelian group isomorphic to C5 Defn: Constant map at 1
>>> from sage.all import * >>> # needs sage.graphs >>> T = simplicial_sets.Torus() >>> f = T.base_point_map(); f Simplicial set morphism: From: Point To: Torus Defn: Constant map at (v_0, v_0) >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> g = S3.base_point_map() >>> f.domain() == g.domain() True >>> RP3 = simplicial_sets.RealProjectiveSpace(Integer(3)) # needs sage.groups >>> temp = simplicial_sets.Simplex(Integer(0)) >>> pt = temp.set_base_point(temp.n_cells(Integer(0))[Integer(0)]) >>> h = RP3.base_point_map(domain=pt) # needs sage.groups >>> f.domain() == h.domain() # needs sage.groups False >>> C5 = groups.misc.MultiplicativeAbelian([Integer(5)]) # needs sage.graphs sage.groups >>> BC5 = simplicial_sets.ClassifyingSpace(C5) # needs sage.graphs sage.groups >>> BC5.base_point_map() # needs 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)[source]#
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: # needs sage.graphs sage.groups sage: simplicial_sets.Sphere(3).connectivity() 2 sage: simplicial_sets.Sphere(0).connectivity() -1 sage: K = simplicial_sets.Simplex(4) sage: K = K.set_base_point(K.n_cells(0)[0]) sage: K.connectivity() +Infinity sage: X = simplicial_sets.Torus().suspension(2) sage: X.connectivity() 2 sage: C2 = groups.misc.MultiplicativeAbelian([2]) # needs sage.graphs sage.groups sage: BC2 = simplicial_sets.ClassifyingSpace(C2) # needs sage.graphs sage.groups sage: BC2.connectivity() # needs sage.graphs sage.groups 0
>>> from sage.all import * >>> # needs sage.graphs sage.groups >>> simplicial_sets.Sphere(Integer(3)).connectivity() 2 >>> simplicial_sets.Sphere(Integer(0)).connectivity() -1 >>> K = simplicial_sets.Simplex(Integer(4)) >>> K = K.set_base_point(K.n_cells(Integer(0))[Integer(0)]) >>> K.connectivity() +Infinity >>> X = simplicial_sets.Torus().suspension(Integer(2)) >>> X.connectivity() 2 >>> C2 = groups.misc.MultiplicativeAbelian([Integer(2)]) # needs sage.graphs sage.groups >>> BC2 = simplicial_sets.ClassifyingSpace(C2) # needs sage.graphs sage.groups >>> BC2.connectivity() # needs sage.graphs sage.groups 0
- cover(character)[source]#
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: # needs sage.graphs sage.groups sage: S1 = simplicial_sets.Sphere(1) sage: W = S1.wedge(S1) sage: G = CyclicPermutationGroup(3) sage: (a, b) = W.n_cells(1) sage: C = W.cover({a : G.gen(0), b : G.gen(0)^2}) sage: C.face_data() {(*, ()): 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) # needs sage.modules Z x Z x Z x Z sage: C.fundamental_group() Finitely presented group < e0, e1, e2, e3 | >
>>> from sage.all import * >>> # needs sage.graphs sage.groups >>> S1 = simplicial_sets.Sphere(Integer(1)) >>> W = S1.wedge(S1) >>> G = CyclicPermutationGroup(Integer(3)) >>> (a, b) = W.n_cells(Integer(1)) >>> C = W.cover({a : G.gen(Integer(0)), b : G.gen(Integer(0))**Integer(2)}) >>> C.face_data() {(*, ()): 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)))} >>> C.homology(Integer(1)) # needs sage.modules Z x Z x Z x Z >>> C.fundamental_group() Finitely presented group < e0, e1, e2, e3 | >
- covering_map(character)[source]#
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: # needs sage.graphs sage.groups sage: S1 = simplicial_sets.Sphere(1) sage: W = S1.wedge(S1) sage: G = CyclicPermutationGroup(3) sage: a, b = W.n_cells(1) sage: C = W.covering_map({a : G.gen(0), b : G.one()}); C 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() Simplicial set with 9 non-degenerate simplices sage: C.domain().face_data() {(*, ()): 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)))}
>>> from sage.all import * >>> # needs sage.graphs sage.groups >>> S1 = simplicial_sets.Sphere(Integer(1)) >>> W = S1.wedge(S1) >>> G = CyclicPermutationGroup(Integer(3)) >>> a, b = W.n_cells(Integer(1)) >>> C = W.covering_map({a : G.gen(Integer(0)), b : G.one()}); C 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] >>> C.domain() Simplicial set with 9 non-degenerate simplices >>> C.domain().face_data() {(*, ()): 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)[source]#
Return the fundamental group of this pointed simplicial set.
INPUT:
simplify
(bool, optionalTrue
) – ifFalse
, then return a presentation of the group in terms of generators and relations. IfTrue
, 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) # needs sage.graphs sage: eight = S1.wedge(S1) # needs sage.graphs sage: eight.fundamental_group() # free group on 2 generators # needs sage.graphs sage.groups Finitely presented group < e0, e1 | >
>>> from sage.all import * >>> S1 = simplicial_sets.Sphere(Integer(1)) # needs sage.graphs >>> eight = S1.wedge(S1) # needs sage.graphs >>> eight.fundamental_group() # free group on 2 generators # needs 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() # needs sage.graphs sage: K = simplicial_sets.KleinBottle() # needs sage.graphs sage: X = T.disjoint_union(K) # needs sage.graphs sage: # needs sage.graphs sage: X_0 = X.set_base_point(X.n_cells(0)[0]) sage: X_0.fundamental_group().is_abelian() # needs sage.groups True sage: X_1 = X.set_base_point(X.n_cells(0)[1]) sage: X_1.fundamental_group().is_abelian() # needs sage.groups False sage: RP3 = simplicial_sets.RealProjectiveSpace(3) # needs sage.graphs sage.groups sage: RP3.fundamental_group() # needs sage.graphs sage.groups Finitely presented group < e | e^2 >
>>> from sage.all import * >>> T = simplicial_sets.Torus() # needs sage.graphs >>> K = simplicial_sets.KleinBottle() # needs sage.graphs >>> X = T.disjoint_union(K) # needs sage.graphs >>> # needs sage.graphs >>> X_0 = X.set_base_point(X.n_cells(Integer(0))[Integer(0)]) >>> X_0.fundamental_group().is_abelian() # needs sage.groups True >>> X_1 = X.set_base_point(X.n_cells(Integer(0))[Integer(1)]) >>> X_1.fundamental_group().is_abelian() # needs sage.groups False >>> RP3 = simplicial_sets.RealProjectiveSpace(Integer(3)) # needs sage.graphs sage.groups >>> RP3.fundamental_group() # needs sage.graphs sage.groups Finitely presented group < e | e^2 >
Compute the fundamental group of some classifying spaces:
sage: C5 = groups.misc.MultiplicativeAbelian([5]) # needs sage.graphs sage.groups sage: BC5 = C5.nerve() # needs sage.graphs sage.groups sage: BC5.fundamental_group() # needs sage.graphs sage.groups Finitely presented group < e0 | e0^5 > sage: # needs sage.graphs sage.groups sage: Sigma3 = groups.permutation.Symmetric(3) sage: BSigma3 = Sigma3.nerve() sage: pi = BSigma3.fundamental_group(); pi Finitely presented group < e1, e2 | e2^2, e1^3, (e2*e1)^2 > sage: pi.order() 6 sage: pi.is_abelian() False
>>> from sage.all import * >>> C5 = groups.misc.MultiplicativeAbelian([Integer(5)]) # needs sage.graphs sage.groups >>> BC5 = C5.nerve() # needs sage.graphs sage.groups >>> BC5.fundamental_group() # needs sage.graphs sage.groups Finitely presented group < e0 | e0^5 > >>> # needs sage.graphs sage.groups >>> Sigma3 = groups.permutation.Symmetric(Integer(3)) >>> BSigma3 = Sigma3.nerve() >>> pi = BSigma3.fundamental_group(); pi Finitely presented group < e1, e2 | e2^2, e1^3, (e2*e1)^2 > >>> pi.order() 6 >>> pi.is_abelian() False
The sphere has a trivial fundamental group:
sage: S2 = simplicial_sets.Sphere(2) # needs sage.graphs sage: S2.fundamental_group() # needs sage.graphs sage.groups Finitely presented group < | >
>>> from sage.all import * >>> S2 = simplicial_sets.Sphere(Integer(2)) # needs sage.graphs >>> S2.fundamental_group() # needs sage.graphs sage.groups Finitely presented group < | >
- is_simply_connected()[source]#
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: # needs sage.graphs sage.groups sage: T = simplicial_sets.Torus() sage: T.is_simply_connected() False sage: T.suspension().is_simply_connected() True sage: simplicial_sets.KleinBottle().is_simply_connected() False sage: # needs sage.graphs sage: S2 = simplicial_sets.Sphere(2) sage: S3 = simplicial_sets.Sphere(3) sage: (S2.wedge(S3)).is_simply_connected() # needs sage.groups True sage: X = S2.disjoint_union(S3) sage: X = X.set_base_point(X.n_cells(0)[0]) sage: X.is_simply_connected() False sage: C3 = groups.misc.MultiplicativeAbelian([3]) # needs sage.graphs sage.groups sage: BC3 = simplicial_sets.ClassifyingSpace(C3) # needs sage.graphs sage.groups sage: BC3.is_simply_connected() # needs sage.graphs sage.groups False
>>> from sage.all import * >>> # needs sage.graphs sage.groups >>> T = simplicial_sets.Torus() >>> T.is_simply_connected() False >>> T.suspension().is_simply_connected() True >>> simplicial_sets.KleinBottle().is_simply_connected() False >>> # needs sage.graphs >>> S2 = simplicial_sets.Sphere(Integer(2)) >>> S3 = simplicial_sets.Sphere(Integer(3)) >>> (S2.wedge(S3)).is_simply_connected() # needs sage.groups True >>> X = S2.disjoint_union(S3) >>> X = X.set_base_point(X.n_cells(Integer(0))[Integer(0)]) >>> X.is_simply_connected() False >>> C3 = groups.misc.MultiplicativeAbelian([Integer(3)]) # needs sage.graphs sage.groups >>> BC3 = simplicial_sets.ClassifyingSpace(C3) # needs sage.graphs sage.groups >>> BC3.is_simply_connected() # needs sage.graphs sage.groups False
- twisted_chain_complex(twisting_operator=None, dimensions=None, augmented=False, cochain=False, verbose=False, subcomplex=None, check=False)[source]#
Return the normalized chain complex twisted by some operator.
A twisting operator is a map from the set of simplices to some algebra. The differentials are then twisted by this operator.
INPUT:
twisting_operator
– a dictionary, associating the twist of each simplex. If it is not given, the canonical one (associated to the laurent polynomial ring abelianization of the fundamental group, ignoring torsion) is used.dimensions
– ifNone
, compute the chain complex in all dimensions. If a list or tuple of integers, compute the chain complex in those dimensions, setting the chain groups in all other dimensions to zero.augmented
(default:False
) – ifTrue
, return the augmented chain complex (that is, include a class in dimension \(-1\) corresponding to the empty cell).cochain
(default:False
) – ifTrue
, return the cochain complex (that is, the dual of the chain complex).verbose
(default:False
) – ignored.subcomplex
(default:None
) – if present, compute the chain complex relative to this subcomplex.check
(default:False
) – IfTrue
, make sure that the chain complex is actually a chain complex: the differentials are composable and their product is zero.
The normalized chain complex of a simplicial set is isomorphic to the chain complex obtained by modding out by degenerate simplices, and the latter is what is actually constructed here.
EXAMPLES:
sage: # needs sage.graphs sage: W = simplicial_sets.Sphere(1).wedge(simplicial_sets.Sphere(2)) sage: W.nondegenerate_simplices() [*, sigma_1, sigma_2] sage: s1 = W.nondegenerate_simplices()[1] sage: L.<t> = LaurentPolynomialRing(QQ) sage: tw = {s1:t} sage: ChC = W.twisted_chain_complex(tw) sage: ChC.differential(1) [-1 + t] sage: ChC.differential(2) [0]
>>> from sage.all import * >>> # needs sage.graphs >>> W = simplicial_sets.Sphere(Integer(1)).wedge(simplicial_sets.Sphere(Integer(2))) >>> W.nondegenerate_simplices() [*, sigma_1, sigma_2] >>> s1 = W.nondegenerate_simplices()[Integer(1)] >>> L = LaurentPolynomialRing(QQ, names=('t',)); (t,) = L._first_ngens(1) >>> tw = {s1:t} >>> ChC = W.twisted_chain_complex(tw) >>> ChC.differential(Integer(1)) [-1 + t] >>> ChC.differential(Integer(2)) [0]
sage: # needs sage.graphs sage: X = simplicial_sets.Torus() sage: C = X.twisted_chain_complex() sage: C.differential(1) [ f3 - 1 f2*f3^-1 - 1 f2 - 1] sage: C.differential(2) [ 1 f2*f3^-1] [ f3 1] [ -1 -1] sage: C.differential(3) []
>>> from sage.all import * >>> # needs sage.graphs >>> X = simplicial_sets.Torus() >>> C = X.twisted_chain_complex() >>> C.differential(Integer(1)) [ f3 - 1 f2*f3^-1 - 1 f2 - 1] >>> C.differential(Integer(2)) [ 1 f2*f3^-1] [ f3 1] [ -1 -1] >>> C.differential(Integer(3)) []
sage: # needs sage.graphs sage: Y = simplicial_sets.RealProjectiveSpace(2) sage: C = Y.twisted_chain_complex() sage: C.differential(1) [-1 + F1] sage: C.differential(2) [1 + F1] sage: C.differential(3) []
>>> from sage.all import * >>> # needs sage.graphs >>> Y = simplicial_sets.RealProjectiveSpace(Integer(2)) >>> C = Y.twisted_chain_complex() >>> C.differential(Integer(1)) [-1 + F1] >>> C.differential(Integer(2)) [1 + F1] >>> C.differential(Integer(3)) []
- twisted_homology(n, reduced=False)[source]#
The \(n\)-th twisted homology module of the simplicial set with respect to the abelianization of the fundamental_group.
It is a module over a polynomial ring, including relations to make some variables the multiplicative inverses of others.
INPUT:
n
– a positive integer.reduced
– (default:False
) if set to True, the presentation matrix will be reduced.
EXAMPLES:
sage: # needs sage.graphs sage: X = simplicial_sets.Sphere(1).wedge(simplicial_sets.Sphere(2)) sage: X.twisted_homology(1) Quotient module by Submodule of Ambient free module of rank 0 over the integral domain Multivariate Polynomial Ring in f1, f1inv over Integer Ring Generated by the rows of the matrix: [] sage: X.twisted_homology(2) Quotient module by Submodule of Ambient free module of rank 1 over the integral domain Multivariate Polynomial Ring in f1, f1inv over Integer Ring Generated by the rows of the matrix: [f1*f1inv - 1]
>>> from sage.all import * >>> # needs sage.graphs >>> X = simplicial_sets.Sphere(Integer(1)).wedge(simplicial_sets.Sphere(Integer(2))) >>> X.twisted_homology(Integer(1)) Quotient module by Submodule of Ambient free module of rank 0 over the integral domain Multivariate Polynomial Ring in f1, f1inv over Integer Ring Generated by the rows of the matrix: [] >>> X.twisted_homology(Integer(2)) Quotient module by Submodule of Ambient free module of rank 1 over the integral domain Multivariate Polynomial Ring in f1, f1inv over Integer Ring Generated by the rows of the matrix: [f1*f1inv - 1]
sage: # needs sage.graphs sage: Y = simplicial_sets.Torus() sage: Y.twisted_homology(1) Quotient module by Submodule of Ambient free module of rank 5 over the integral domain Multivariate Polynomial Ring in f2, f2inv, f3, f3inv over Integer Ring Generated by the rows of the matrix: [ 1 0 0 0 0] [ 0 1 0 0 0] [ 0 0 1 0 0] [ 0 0 0 1 0] [ 0 0 0 0 1] [f2*f2inv - 1 0 0 0 0] [ 0 f2*f2inv - 1 0 0 0] [ 0 0 f2*f2inv - 1 0 0] [ 0 0 0 f2*f2inv - 1 0] [ 0 0 0 0 f2*f2inv - 1] [f3*f3inv - 1 0 0 0 0] [ 0 f3*f3inv - 1 0 0 0] [ 0 0 f3*f3inv - 1 0 0] [ 0 0 0 f3*f3inv - 1 0] [ 0 0 0 0 f3*f3inv - 1] sage: Y.twisted_homology(2) Quotient module by Submodule of Ambient free module of rank 0 over the integral domain Multivariate Polynomial Ring in f2, f2inv, f3, f3inv over Integer Ring Generated by the rows of the matrix: [] sage: Y.twisted_homology(1, reduced=True) Quotient module by Submodule of Ambient free module of rank 5 over the integral domain Multivariate Polynomial Ring in f2, f2inv, f3, f3inv over Integer Ring Generated by the rows of the matrix: [1 0 0 0 0] [0 1 0 0 0] [0 0 1 0 0] [0 0 0 1 0] [0 0 0 0 1]
>>> from sage.all import * >>> # needs sage.graphs >>> Y = simplicial_sets.Torus() >>> Y.twisted_homology(Integer(1)) Quotient module by Submodule of Ambient free module of rank 5 over the integral domain Multivariate Polynomial Ring in f2, f2inv, f3, f3inv over Integer Ring Generated by the rows of the matrix: [ 1 0 0 0 0] [ 0 1 0 0 0] [ 0 0 1 0 0] [ 0 0 0 1 0] [ 0 0 0 0 1] [f2*f2inv - 1 0 0 0 0] [ 0 f2*f2inv - 1 0 0 0] [ 0 0 f2*f2inv - 1 0 0] [ 0 0 0 f2*f2inv - 1 0] [ 0 0 0 0 f2*f2inv - 1] [f3*f3inv - 1 0 0 0 0] [ 0 f3*f3inv - 1 0 0 0] [ 0 0 f3*f3inv - 1 0 0] [ 0 0 0 f3*f3inv - 1 0] [ 0 0 0 0 f3*f3inv - 1] >>> Y.twisted_homology(Integer(2)) Quotient module by Submodule of Ambient free module of rank 0 over the integral domain Multivariate Polynomial Ring in f2, f2inv, f3, f3inv over Integer Ring Generated by the rows of the matrix: [] >>> Y.twisted_homology(Integer(1), reduced=True) Quotient module by Submodule of Ambient free module of rank 5 over the integral domain Multivariate Polynomial Ring in f2, f2inv, f3, f3inv over Integer Ring Generated by the rows of the matrix: [1 0 0 0 0] [0 1 0 0 0] [0 0 1 0 0] [0 0 0 1 0] [0 0 0 0 1]
- universal_cover()[source]#
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: # needs sage.graphs sage.groups sage: RP3 = simplicial_sets.RealProjectiveSpace(3) sage: C = RP3.universal_cover(); C Simplicial set with 8 non-degenerate simplices sage: C.face_data() {(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() Finitely presented group < | >
>>> from sage.all import * >>> # needs sage.graphs sage.groups >>> RP3 = simplicial_sets.RealProjectiveSpace(Integer(3)) >>> C = RP3.universal_cover(); C Simplicial set with 8 non-degenerate simplices >>> C.face_data() {(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))} >>> C.fundamental_group() Finitely presented group < | >
- universal_cover_map()[source]#
Return the universal covering map of the simplicial set.
It requires the fundamental group to be finite.
EXAMPLES:
sage: RP2 = simplicial_sets.RealProjectiveSpace(2) # needs sage.graphs sage.groups sage: phi = RP2.universal_cover_map(); phi # needs sage.graphs 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() # needs sage.graphs 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))}
>>> from sage.all import * >>> RP2 = simplicial_sets.RealProjectiveSpace(Integer(2)) # needs sage.graphs sage.groups >>> phi = RP2.universal_cover_map(); phi # needs sage.graphs 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] >>> phi.domain().face_data() # needs sage.graphs 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[source]#
Bases:
object
- Pointed()[source]#
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
>>> from sage.all import * >>> from sage.categories.simplicial_sets import SimplicialSets >>> SimplicialSets().Pointed().Finite() Category of finite pointed simplicial sets >>> SimplicialSets().Finite().Pointed() Category of finite pointed simplicial sets
- super_categories()[source]#
EXAMPLES:
sage: from sage.categories.simplicial_sets import SimplicialSets sage: SimplicialSets().super_categories() [Category of sets]
>>> from sage.all import * >>> from sage.categories.simplicial_sets import SimplicialSets >>> SimplicialSets().super_categories() [Category of sets]