Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Project: Sage Days 74
Views: 198
Kernel: SageMath 7.3.beta2

Nerves

The nerve of a category (or group or monoid) is naturally constructed as a simplicial set.

The nerve (or classifying space) of a group:

  • one vertex

  • one edge for each element of the group

  • one nn-simplex for each nn-tuple (a1,a2,...,an)(a_1, a_2, ..., a_n), non-degenerate if ai1a_i \neq 1 for all ii

  • face maps: multiply consecutive elements:

    • d0(a1a2an)=a2and_{0} (a_1 a_2 \cdots a_n) = a_{2} \cdots a_{n}

    • dn(a1a2an)=a1an1d_{n} (a_{1} a_{2} \cdots a_{n}) = a_{1} \cdots a_{n-1}

    • di(a1a2an)=a1(aiai+1)an1d_{i} (a_{1} a_{2} \cdots a_{n}) = a_{1} \cdots (a_{i} a_{i+1}) \cdots a_{n-1}, 1in11 \leq i \leq n-1

  • degeneracy maps: insert 11 in the jjth spot:

    • sj(a1an)=a1aj1aj+1ans_{j} (a_{1} \cdots a_{n}) = a_{1} \cdots a_{j} 1 a_{j+1} \cdots a_{n}, 0jn0 \leq j \leq n

Similar for monoids or categories: one vertex for each object, one 1-simplex for each morphism, one nn-simplex for each collection of nn composable morphisms.

Also, given the nerve of a category, you can recover the category.

Are categories in good enough shape in Sage to be able to define the nerve of a (finite) category?

Example: real projective space

Infinite dimensional real projective space RP\mathbb{R} P^{\infty} is the classifying space of the group Z/2Z\mathbb{Z}/2\mathbb{Z}. There is one non-degenerate simplex in each dimension. RPn\mathbb{R} P^{n} is its nn-skeleton.

Look at the ff-vectors for simplicial complex versions of RPn\mathbb{R} P^{n} for small values of nn:

simplicial_complexes.RealProjectiveSpace(2).f_vector()
[1, 6, 15, 10]
simplicial_complexes.RealProjectiveSpace(3).f_vector()
[1, 11, 51, 80, 40]
simplicial_complexes.RealProjectiveSpace(4).f_vector()
[1, 16, 120, 330, 375, 150]
simplicial_complexes.RealProjectiveSpace?

For RP5\mathbb{R}P^5, the ff-vector is (1, 63, 903, 4200, 8400, 7560, 2520).

In comparison, as a simplicial set:

simplicial_sets.RealProjectiveSpace(10).f_vector()
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

Some calculations...

%time simplicial_complexes.RealProjectiveSpace(4).cohomology_ring(GF(2))
CPU times: user 938 ms, sys: 101 ms, total: 1.04 s Wall time: 4.23 s
Cohomology ring of Minimal triangulation of RP^4 over Finite Field of size 2
%time simplicial_sets.RealProjectiveSpace(36).cohomology_ring(GF(2))
CPU times: user 340 ms, sys: 17.5 ms, total: 358 ms Wall time: 347 ms
Cohomology ring of RP^36 over Finite Field of size 2
H = simplicial_sets.RealProjectiveSpace(36).cohomology_ring(GF(2))
H.basis()
Finite family {(18, 0): h^{18,0}, (3, 0): h^{3,0}, (8, 0): h^{8,0}, (29, 0): h^{29,0}, (34, 0): h^{34,0}, (14, 0): h^{14,0}, (19, 0): h^{19,0}, (24, 0): h^{24,0}, (4, 0): h^{4,0}, (9, 0): h^{9,0}, (30, 0): h^{30,0}, (35, 0): h^{35,0}, (15, 0): h^{15,0}, (20, 0): h^{20,0}, (25, 0): h^{25,0}, (5, 0): h^{5,0}, (10, 0): h^{10,0}, (31, 0): h^{31,0}, (36, 0): h^{36,0}, (0, 0): h^{0,0}, (21, 0): h^{21,0}, (26, 0): h^{26,0}, (6, 0): h^{6,0}, (11, 0): h^{11,0}, (16, 0): h^{16,0}, (1, 0): h^{1,0}, (22, 0): h^{22,0}, (27, 0): h^{27,0}, (32, 0): h^{32,0}, (7, 0): h^{7,0}, (12, 0): h^{12,0}, (17, 0): h^{17,0}, (2, 0): h^{2,0}, (23, 0): h^{23,0}, (28, 0): h^{28,0}, (33, 0): h^{33,0}, (13, 0): h^{13,0}}
x = list(H.basis(1))[0] x
h^{1,0}
x**25
h^{25,0}
x.Sq(1).Sq(2).Sq(4)
h^{8,0}

Classifying space of C3C_{3}

In Sage, the cyclic group C3C_{3} has three elements, 11, ff, f2f^{2}.

So its classifying space has two nondegenerate 1-simplices, four non-degenerate 2-simplices (fff*f, f2ff^{2}*f, ff2f*f^{2}, f2f2f^{2}*f^{2}), eight non-degenerate 3-simplices, etc.

C3 = groups.misc.MultiplicativeAbelian([3]) BC3 = C3.nerve_n_skeleton(5) BC3
Simplicial set with 63 non-degenerate simplices
BC3.homology()
{0: 0, 1: C3, 2: 0, 3: C3, 4: 0, 5: Z^22}
BC3.fundamental_group()
Finitely presented group < e0 | e0^3 >

Classifying space of Σ3\Sigma_{3}

Sigma3 = groups.permutation.Symmetric(3) BSigma3 = Sigma3.nerve_n_skeleton(4)
BSigma3
Simplicial set with 781 non-degenerate simplices
BSigma3.homology()
{0: 0, 1: C2, 2: 0, 3: C6, 4: Z^520}
BSigma3.fundamental_group()
Finitely presented group < e0, e1 | e0^2, e1^3, (e0*e1^-1)^2 >
BSigma4 = groups.permutation.Symmetric(4).nerve_n_skeleton(3) BSigma4
Simplicial set with 12720 non-degenerate simplices
BSigma4.fundamental_group()
Finitely presented group < e3, e19 | e19^3, (e3*e19^-1)^2, e3^4 >
BD17 = groups.permutation.Dihedral(17).nerve_n_skeleton(2) BD17.f_vector()
[1, 33, 1089]
BD17.fundamental_group()
Finitely presented group < e1, e4 | e4^2, (e4*e1^-1)^2, e1^17 >

Example: complex projective space

CPn\mathbb{C} P^{n} is the 2n2n-skeleton of the classifying space of the Lie group S1S^{1}. Sage can't construct it that way, but work of Sergeraert (Kenzo, CAT) leads to constructions we can use in Sage.

ff-vectors as simplicial complexes:

simplicial_complexes.ComplexProjectivePlane().f_vector()
[1, 9, 36, 84, 90, 36]
simplicial_complexes.ComplexProjectiveSpace(3).f_vector()
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-27-4e74e8a803a4> in <module>() ----> 1 simplicial_complexes.ComplexProjectiveSpace(Integer(3)).f_vector() AttributeError: 'module' object has no attribute 'ComplexProjectiveSpace'

As simplicial sets:

simplicial_sets.ComplexProjectiveSpace(2).f_vector()
[1, 0, 2, 3, 3]
simplicial_sets.ComplexProjectiveSpace(3).f_vector()
[1, 0, 3, 10, 25, 30, 15]
simplicial_sets.ComplexProjectiveSpace(4).f_vector()
[1, 0, 4, 22, 97, 255, 390, 315, 105]
CP3 = simplicial_sets.ComplexProjectiveSpace(3)
CP3.homology()
{0: 0, 1: 0, 2: Z, 3: 0, 4: Z, 5: 0, 6: Z}
CP3.fundamental_group()
Group( <identity> of ... )

To do:


  • good conversions from simplicial complexes (and other objects) to simplicial sets

  • simplicial abelian groups, kk-skeleton of K(π,n)K(\pi,n)

  • infinite simplicial sets

  • general framework for simplicial objects in a category

  • higher homotopy groups (?)

from sage.homology.simplicial_set import *
v = NonDegenerateSimplex(0) w = NonDegenerateSimplex(0)
e = NonDegenerateSimplex(1)
SimplicialSet({e: (v, w)})
Simplicial set with 3 non-degenerate simplices