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.