This method essentially removes all scalar units from the matrices in the differential of $C$.
We illustrate this in a simple example.
i1 : S = ZZ/32003[a,b]; |
i2 : I = ideal(a^2-b^2, a*b) 2 2 o2 = ideal (a - b , a*b) o2 : Ideal of S |
i3 : C = freeResolution(I, FastNonminimal=>true) 1 3 2 o3 = S <-- S <-- S 0 1 2 o3 : Complex |
i4 : betti C 0 1 2 o4 = total: 1 3 2 0: 1 . . 1: . 2 1 2: . 1 1 o4 : BettiTally |
i5 : D = minimize C 1 2 1 o5 = S <-- S <-- S 0 1 2 o5 : Complex |
i6 : assert(isWellDefined D and isHomogeneous D) |
i7 : betti D 0 1 2 o7 = total: 1 2 1 0: 1 . . 1: . 2 . 2: . . 1 o7 : BettiTally |
i8 : g = D.cache.minimizingMap 1 1 o8 = 0 : S <--------- S : 0 | 1 | 2 3 1 : S <------------------ S : 1 {2} | 1 0 -b | {2} | 0 1 a | 1 2 2 : S <--------------- S : 2 {4} | 0 1 | o8 : ComplexMap |
i9 : assert isWellDefined g |
i10 : assert(isComplexMorphism g and isQuasiIsomorphism g) |
i11 : assert(source g == C) |
i12 : assert(target g == D) |
i13 : assert(coker g == 0) |
The minimal complex $D$ is a direct summand of the original complex $C$. The natural inclusion of $D$ into $C$ can be constructed as follows.
i14 : f = liftMapAlongQuasiIsomorphism(id_D, g) 1 1 o14 = 0 : S <--------- S : 0 | 1 | 3 2 1 : S <--------------- S : 1 {2} | 1 0 | {2} | 0 1 | {3} | 0 0 | 2 1 2 : S <------------- S : 2 {3} | a | {4} | 1 | o14 : ComplexMap |
i15 : g*f == id_D o15 = true |
i16 : assert(source f == D) |
i17 : assert(target f == C) |
i18 : assert(ker f == 0) |
i19 : f*g 1 1 o19 = 0 : S <--------- S : 0 | 1 | 3 3 1 : S <------------------ S : 1 {2} | 1 0 -b | {2} | 0 1 a | {3} | 0 0 0 | 2 2 2 : S <--------------- S : 2 {3} | 0 a | {4} | 0 1 | o19 : ComplexMap |
The chain complex $D$ is a direct summand of $C$, giving rise to a split short exact sequence of chain complexes.
i20 : h = prune canonicalMap(C, ker g) 3 1 o20 = 1 : S <-------------- S : 1 {2} | -b | {2} | a | {3} | -1 | 2 1 2 : S <------------- S : 2 {3} | 1 | {4} | 0 | o20 : ComplexMap |
i21 : assert isShortExactSequence(g, h) |
Warning: If the input complex is not homogeneous, then the output is probably not what one would expect.
i22 : S = ZZ/32003[a..d] o22 = S o22 : PolynomialRing |
i23 : J = ideal(a*b*c-b*c, a*d-c, a^3-d^2*c) 3 2 o23 = ideal (a*b*c - b*c, a*d - c, a - c*d ) o23 : Ideal of S |
i24 : CJ = freeResolution J 1 4 4 1 o24 = S <-- S <-- S <-- S 0 1 2 3 o24 : Complex |
i25 : assert not isHomogeneous CJ |
i26 : D = minimize CJ 1 3 1 o26 = S <-- cokernel | 0 | <-- S <-- S | 0 | 0 | -c+d | 2 3 | a-1 | 1 o26 : Complex |
i27 : isWellDefined D o27 = true |
i28 : prune HH D == prune HH CJ o28 = true |