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.