Given a chain complex C, the routine returns a surjective ChainComplexMap p:F->C from a free complex. The complex F is constructed from minimal free resolutions of the terms of C by the method of iterated mapping cones.
That is, if C: 0 -> Cn ->...->Cm ->0 is a chain complex, and Gi is a resolution of Ci, and [G -> F] denotes the mapping cone of a map of complexes G \to F, then the resolution of C is Gm if n=m; is [Gn->Gm] if n = m+1 and otherwise is defined inductively as Fi = [Gi -> F(i-1)] where the map Gi -> F(i-1) is induced by lifing Gi_0 --> G(i-1)_0 to the kernel of the (i-1)-st differential of F(i-1).
The complex F = source p is not necessarily minimal, but minimize F returns a morphism to a minimal free chain complex quasi-isomorphic to F, and dual minimimize dual F returns a quasi-isomorphism from a minimal free complex, so
p*(dual minimimize dual F)
is the quasi-isomorphism from the minimal free resolution of C.
i1 : kk= ZZ/101 o1 = kk o1 : QuotientRing |
i2 : S = kk[a,b,c] o2 = S o2 : PolynomialRing |
i3 : R = S/ideal"ab2,a2c3" o3 = R o3 : QuotientRing |
i4 : f = map(R,S,vars R)
o4 = map(R,S,{a, b, c})
o4 : RingMap R <--- S
|
i5 : C = res(R^1/(ideal vars R))**(R^1/(ideal vars R)^5); |
i6 : mods = for i from 0 to max C list pushForward(f, C_i); |
i7 : C = chainComplex for i from min C+1 to max C list map(mods_(i-1),mods_i,substitute(matrix C.dd_i,S)); |
i8 : time m = resolutionOfChainComplex C;
-- used 0.173997 seconds
|
i9 : time n = cartanEilenbergResolution C;
-- used 0.240068 seconds
|
i10 : betti source m
0 1 2 3 4 5 6 7
o10 = total: 1 19 80 181 312 484 447 156
0: 1 3 3 1 . . . .
1: . . 1 3 3 . . .
2: . 1 3 3 2 . . .
3: . . 1 4 6 3 . .
4: . 15 72 139 137 64 12 .
5: . . . 16 75 141 117 36
6: . . . . 2 20 27 12
7: . . . 15 72 138 117 36
8: . . . . 15 103 147 60
9: . . . . . . . .
10: . . . . . 15 27 12
o10 : BettiTally
|
i11 : betti source n
0 1 2 3 4 5 6 7
o11 = total: 1 38 133 266 450 571 447 156
0: 1 3 6 2 . . . .
1: . 3 3 6 6 1 . .
2: . 2 6 6 4 3 . .
3: . . 16 35 25 4 . .
4: . 30 102 155 154 100 12 .
5: . . . 32 111 142 117 36
6: . . . . 18 50 27 12
7: . . . 30 102 153 117 36
8: . . . . 30 103 147 60
9: . . . . . . . .
10: . . . . . 15 27 12
o11 : BettiTally
|
i12 : betti target minimize source n
0 1 2 3 4 5 6 7
o12 = total: 1 17 72 165 302 484 447 156
0: 1 3 3 1 . . . .
1: . . . . . . . .
2: . . . . 1 . . .
3: . . . . 3 3 . .
4: . 14 69 136 135 64 12 .
5: . . . 14 75 141 117 36
6: . . . . 1 20 27 12
7: . . . 14 72 138 117 36
8: . . . . 15 103 147 60
9: . . . . . . . .
10: . . . . . 15 27 12
o12 : BettiTally
|
The resolution of a free complex is of course the same complex. resolutionOfChainComplex returns this minimal object directly, but cartanEilenbergResolution does not:
i13 : C=koszul (gens (ideal vars S)^2)
1 6 15 20 15 6 1
o13 = S <-- S <-- S <-- S <-- S <-- S <-- S
0 1 2 3 4 5 6
o13 : ChainComplex
|
i14 : betti source resolutionOfChainComplex C
0 1 2 3 4 5 6
o14 = total: 1 6 15 20 15 6 1
0: 1 . . . . . .
1: . 6 . . . . .
2: . . 15 . . . .
3: . . . 20 . . .
4: . . . . 15 . .
5: . . . . . 6 .
6: . . . . . . 1
o14 : BettiTally
|
i15 : betti source cartanEilenbergResolution C
0 1 2 3 4 5 6
o15 = total: 1 14 39 54 39 13 2
0: 1 . . . . . .
1: . 6 8 . . . .
2: . 8 15 6 . . .
3: . . 6 30 . . .
4: . . 10 . 33 . .
5: . . . 18 . 12 .
6: . . . . 6 . 2
7: . . . . . 1 .
o15 : BettiTally
|
The object resolutionOfChainComplex is a method function with options.