One way to define the cellular chain complex of a CW-complex uses the spectral sequence associated to its skeletal filtration.
Consider, for example, an empty cube with its usual CW-structure: 8 vertices, 12 edges, and 6 faces. We depict the cube unfolded.
| 1 ________ 2 | | | | | | | | | | |________|________ 2 | 3| 4| | | | | | | | | | | |________|________|________ 2 | 5 6| 8| | | | | | | | | | | |________|________| | 5 7| |1 | | | | | | | |________| | 5 3 |
By introducing diagonals on every square facet (crudely indicated below), we obtain a simplicial complex with 8 vertices, 18 edges, and 12 faces.
| 1 ________ 2 | |\ | | | \ | | | \ | | |________|________ 2 | 3|\ 4|\ | | | \ | \ | | | \ | \ | | |________|________|________ 2 | 5 6|\ 8|\ | | | \ | \ | | | \ | \ | | |________|________| | 5 7|\ |1 | | \ | | | \ | | |________| | 5 3 |
The facets are now triangles. We list these, and use them to populate the lists of edges and vertices.
i1 : face2 = {{1,2,4},{1,3,4},{3,4,6},{3,5,6},{2,4,8},{4,6,8},{5,6,7},{6,7,8},
{1,2,8},{1,7,8},{1,3,7},{3,5,7}};
|
i2 : face1 = unique(flatten(apply(subsets({0,1,2},2), s-> apply(face2, f->f_s))));
|
i3 : face0 = unique(flatten(apply(subsets({0,1,2},1), s-> apply(face2, f->f_s))));
|
Here are the diagonal edges that we added
i4 : diags = {{1,4},{3,6},{4,8},{6,7},{1,8},{3,7}};
|
We now write the function that takes a simplex and returns the CW-skeleton to which it belongs. The vertices are in the 0-skeleton, and the faces are in the 2-skeleton, but the diagonal edges we added are not actually present in the 1-skeleton of the original CW-structure on the cube. So these edges have skeletal degree 2.
i5 : skel = f -> if #f != 2 then #f-1 else if member(f,diags) then 2 else 1; |
Let t be the variable that's in charge of recording filtration degree. We build free modules for the 0-, 1-, and 2-chains for simplicial homology using the function skel to determine degrees:
i6 : R = ZZ[t] o6 = R o6 : PolynomialRing |
i7 : free0 = R^(-apply(face0,skel))
8
o7 = R
o7 : R-module, free
|
i8 : free1 = R^(-apply(face1,skel))
18
o8 = R
o8 : R-module, free, degrees {7:1, 2, 1..2, 2, 1..2, 2:1, 2:2, 1}
|
i9 : free2 = R^(-apply(face2,skel))
12
o9 = R
o9 : R-module, free, degrees {12:2}
|
The usual differential for simplicial chains must be modified by powers of t to maintain homogeneity. These powers appear when a simplex has a face of lower filtration degree.
i10 : omega = (a,b)->if isSubset(a,b) then (-1)^(position(b, v->not member(v,a))) * t^(skel(b)-skel(a)) else 0 o10 = omega o10 : FunctionClosure |
i11 : d12 = map(free1, free2, matrix table(face1,face2,omega))
o11 = {1} | t 0 0 0 0 0 0 0 t 0 0 0 |
{1} | 0 t 0 0 0 0 0 0 0 0 t 0 |
{1} | 0 t t 0 0 0 0 0 0 0 0 0 |
{1} | 0 0 0 t 0 0 0 0 0 0 0 t |
{1} | t 0 0 0 t 0 0 0 0 0 0 0 |
{1} | 0 0 t 0 0 t 0 0 0 0 0 0 |
{1} | 0 0 0 t 0 0 t 0 0 0 0 0 |
{2} | 0 0 0 0 0 0 1 1 0 0 0 0 |
{1} | 0 0 0 0 0 0 0 0 0 t -t 0 |
{2} | -1 -1 0 0 0 0 0 0 0 0 0 0 |
{2} | 0 0 -1 -1 0 0 0 0 0 0 0 0 |
{1} | 0 0 0 0 -t 0 0 0 t 0 0 0 |
{2} | 0 0 0 0 1 -1 0 0 0 0 0 0 |
{1} | 0 0 0 0 0 0 -t 0 0 0 0 t |
{1} | 0 0 0 0 0 t 0 -t 0 0 0 0 |
{2} | 0 0 0 0 0 0 0 0 -1 -1 0 0 |
{2} | 0 0 0 0 0 0 0 0 0 0 1 -1 |
{1} | 0 0 0 0 0 0 0 t 0 t 0 0 |
18 12
o11 : Matrix R <--- R
|
i12 : d01 = map(free0, free1, matrix table(face0,face1,omega))
o12 = | -t -t 0 0 0 0 0 0 -t -t2 0 0 0 0 0 -t2 0 0 |
| 0 t -t -t 0 0 0 0 0 0 -t2 0 0 0 0 0 -t2 0 |
| t 0 0 0 -t 0 0 0 0 0 0 -t 0 0 0 0 0 0 |
| 0 0 t 0 t -t 0 0 0 t2 0 0 -t2 0 0 0 0 0 |
| 0 0 0 t 0 0 -t 0 0 0 0 0 0 -t 0 0 0 0 |
| 0 0 0 0 0 t t -t2 0 0 t2 0 0 0 -t 0 0 0 |
| 0 0 0 0 0 0 0 t2 t 0 0 0 0 t 0 0 t2 -t |
| 0 0 0 0 0 0 0 0 0 0 0 t t2 0 t t2 0 t |
8 18
o12 : Matrix R <--- R
|
We build the chain complex, shift it appropriately, and restack until it is a module for the ring $\ZZ[d,t]/d^2$.
i13 : sm = sequenceModule(R[d,Degrees=>{{-1}}]/d^2,{d12,d01,map(R^{},free0,{})});
|
i14 : sm = sm ** (ring sm)^{{-2,0}};
|
i15 : smm = restackModule({2,1},sm);
|
i16 : M = restackModule({1,1},smm)
o16 = cokernel {2, 2} | d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{2, 2} | 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{2, 2} | 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{2, 2} | 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{2, 2} | 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{2, 2} | 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{2, 2} | 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{2, 2} | 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{2, 2} | 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{2, 2} | 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{2, 2} | 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{2, 2} | 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 1} | -t 0 0 0 0 0 0 0 -t 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 1} | 0 -t 0 0 0 0 0 0 0 0 -t 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 1} | 0 -t -t 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 1} | 0 0 0 -t 0 0 0 0 0 0 0 -t 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 1} | -t 0 0 0 -t 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 1} | 0 0 -t 0 0 -t 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 1} | 0 0 0 -t 0 0 -t 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 2} | 0 0 0 0 0 0 -1 -1 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 1} | 0 0 0 0 0 0 0 0 0 -t t 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 2} | 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 2} | 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 1} | 0 0 0 0 t 0 0 0 -t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 2} | 0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 1} | 0 0 0 0 0 0 t 0 0 0 0 -t 0 0 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 |
{1, 1} | 0 0 0 0 0 -t 0 t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 |
{1, 2} | 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 |
{1, 2} | 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 |
{1, 1} | 0 0 0 0 0 0 0 -t 0 -t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 |
{0, 0} | 0 0 0 0 0 0 0 0 0 0 0 0 t t 0 0 0 0 0 0 t t2 0 0 0 0 0 t2 0 0 d 0 0 0 0 0 0 0 |
{0, 0} | 0 0 0 0 0 0 0 0 0 0 0 0 0 -t t t 0 0 0 0 0 0 t2 0 0 0 0 0 t2 0 0 d 0 0 0 0 0 0 |
{0, 0} | 0 0 0 0 0 0 0 0 0 0 0 0 -t 0 0 0 t 0 0 0 0 0 0 t 0 0 0 0 0 0 0 0 d 0 0 0 0 0 |
{0, 0} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t 0 -t t 0 0 0 -t2 0 0 t2 0 0 0 0 0 0 0 0 d 0 0 0 0 |
{0, 0} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t 0 0 t 0 0 0 0 0 0 t 0 0 0 0 0 0 0 0 d 0 0 0 |
{0, 0} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t -t t2 0 0 -t2 0 0 0 t 0 0 0 0 0 0 0 0 d 0 0 |
{0, 0} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t2 -t 0 0 0 0 -t 0 0 -t2 t 0 0 0 0 0 0 d 0 |
{0, 0} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -t -t2 0 -t -t2 0 -t 0 0 0 0 0 0 0 d |
ZZ[d, t] /ZZ[d, t]\38
o16 : ---------module, quotient of |--------|
2 | 2 |
d \ d /
|
The module M records the simplicial chain complex of the (empty interior, faces triangulated) cube with t acting by the filtration inclusions coming from the usual CW structure of the empty cube.
To build the corresponding exact couple, use exactCouple.
i17 : couple = prune exactCouple M
warning: clearing value of symbol t to allow access to subscripted variables based on it
: debug with expression debug 5504 or with command line option --debug 5504
o17 = cokernel {5, 5} | e_1^2 e_1t_1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{4, 4} | 0 0 t_1 0 0 0 0 e_1^3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{4, 4} | 0 0 0 t_1 0 0 0 0 e_1^3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{4, 4} | 0 0 0 0 t_1 0 0 0 0 e_1^3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{4, 4} | 0 0 0 0 0 t_1 0 0 0 0 e_1^3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{4, 4} | 0 0 0 0 0 0 t_1 0 0 0 0 e_1^3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
{2, 2} | 0 0 0 0 0 0 0 0 0 0 0 0 t_1 0 0 0 0 0 0 e_1^3 0 0 0 0 0 0 0 0 |
{2, 2} | 0 0 0 0 0 0 0 0 0 0 0 0 0 t_1 0 0 0 0 0 0 e_1^3 0 0 0 0 0 0 0 |
{2, 2} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 t_1 0 0 0 0 0 0 e_1^3 0 0 0 0 0 0 |
{2, 2} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 t_1 0 0 0 0 0 0 e_1^3 0 0 0 0 0 |
{2, 2} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 t_1 0 0 0 0 0 0 e_1^3 0 0 0 0 |
{2, 2} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 t_1 0 0 0 0 0 0 e_1^3 0 0 0 |
{2, 2} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 t_1 0 0 0 0 0 0 e_1^3 0 0 |
{1, 1} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 e_1^2 e_1t_1 |
14
o17 : ZZ[e , t ]-module, quotient of (ZZ[e , t ])
1 1 1 1
|
i18 : plotPages((-1..3,-1..3,1..2), prune @@ evaluateInDegree, couple)
warning: clearing value of symbol e to allow access to subscripted variables based on it
: debug with expression debug 3903 or with command line option --debug 3903
warning: clearing value of symbol t to allow access to subscripted variables based on it
: debug with expression debug 5504 or with command line option --debug 5504
page 1, with differential of degree {-1, -1}:
+----++----+---+----+---+---+
|q=3 ||0 |0 |0 |0 |0 |
+----++----+---+----+---+---+
| || | | | 6| |
|q=2 ||0 |0 |0 |ZZ |0 |
+----++----+---+----+---+---+
| || | | 12| | |
|q=1 ||0 |0 |ZZ |0 |0 |
+----++----+---+----+---+---+
| || | 8| | | |
|q=0 ||0 |ZZ |0 |0 |0 |
+----++----+---+----+---+---+
|q=-1||0 |0 |0 |0 |0 |
+----++----+---+----+---+---+
| ||p=-1|p=0|p=1 |p=2|p=3|
+----++----+---+----+---+---+
page 2, with differential of degree {-1, -2}:
+----++----+---+---+---+---+
|q=3 ||0 |0 |0 |0 |0 |
+----++----+---+---+---+---+
| || | | | 1| |
|q=2 ||0 |0 |0 |ZZ |0 |
+----++----+---+---+---+---+
|q=1 ||0 |0 |0 |0 |0 |
+----++----+---+---+---+---+
| || | 1| | | |
|q=0 ||0 |ZZ |0 |0 |0 |
+----++----+---+---+---+---+
|q=-1||0 |0 |0 |0 |0 |
+----++----+---+---+---+---+
| ||p=-1|p=0|p=1|p=2|p=3|
+----++----+---+---+---+---+
|
Page 1 consists of the CW-chains, and page 2 consists of the CW-homology, which is therefore isomorphic to the simplicial homology.