This is frequently useful to make the output of certain operations readable or understandable. This operation is functorial, applying both to complexes and complex maps.
In particular, homology often needs to be pruned to be understood. For instance, this is useful for recognizing when terms given by subquotient modules are actually zero.
i1 : S = ZZ/101[a,b,c,d,e]; |
i2 : I = ideal(a,b) * ideal(c,d,e) o2 = ideal (a*c, a*d, a*e, b*c, b*d, b*e) o2 : Ideal of S |
i3 : F = dual freeResolution I 1 5 9 6 1 o3 = S <-- S <-- S <-- S <-- S -4 -3 -2 -1 0 o3 : Complex |
i4 : C = HH F o4 = cokernel {-5} | -e d -c -b a | <-- subquotient ({-4} | d c 0 b 0 0 a 0 0 0 |, {-4} | d -c -b a 0 0 0 0 0 |) <-- subquotient ({-3} | c b a 0 0 0 0 |, {-3} | -b a 0 0 0 0 |) <-- subquotient ({-2} | ac |, {-2} | ac |) <-- image 0 {-4} | e 0 c 0 b 0 0 a 0 0 | {-4} | e 0 0 0 -c -b a 0 0 | {-3} | d 0 0 b 0 a 0 | {-3} | 0 0 -b a 0 0 | {-2} | bc | {-2} | bc | -4 {-4} | 0 -e d 0 0 b 0 0 a 0 | {-4} | 0 e 0 0 -d 0 0 -b a | {-3} | 0 d 0 -c 0 0 0 | {-3} | -d 0 c 0 0 0 | {-2} | ad | {-2} | ad | 0 {-4} | 0 0 0 -e d -c 0 0 0 a | {-4} | 0 0 e 0 0 -d 0 c 0 | {-3} | 0 0 -d 0 0 c 0 | {-3} | 0 -d 0 c 0 0 | {-2} | bd | {-2} | bd | {-4} | 0 0 0 0 0 0 e -d c b | {-4} | 0 0 0 e 0 0 -d 0 c | {-3} | e 0 0 0 b 0 a | {-3} | 0 0 0 0 -b a | {-2} | ae | {-2} | ae | {-3} | 0 e 0 0 -c 0 0 | {-3} | -e 0 0 0 c 0 | {-2} | be | {-2} | be | -3 {-3} | 0 0 -e 0 0 0 c | {-3} | 0 -e 0 0 0 c | {-3} | 0 0 0 e -d 0 0 | {-3} | 0 0 -e 0 d 0 | -1 {-3} | 0 0 0 0 0 -e d | {-3} | 0 0 0 -e 0 d | -2 o4 : Complex |
i5 : D = prune C o5 = cokernel {-5} | e d c b a | <-- cokernel {-3} | e d c | <-- cokernel {-2} | b a | -4 -3 -2 o5 : Complex |
i6 : g = D.cache.pruningMap o6 = -4 : cokernel {-5} | -e d -c -b a | <-------------- cokernel {-5} | e d c b a | : -4 {-5} | 1 | -3 : subquotient ({-4} | d c 0 b 0 0 a 0 0 0 |, {-4} | d -c -b a 0 0 0 0 0 |) <-------------- cokernel {-3} | e d c | : -3 {-4} | e 0 c 0 b 0 0 a 0 0 | {-4} | e 0 0 0 -c -b a 0 0 | {-3} | 0 | {-4} | 0 -e d 0 0 b 0 0 a 0 | {-4} | 0 e 0 0 -d 0 0 -b a | {-3} | 0 | {-4} | 0 0 0 -e d -c 0 0 0 a | {-4} | 0 0 e 0 0 -d 0 c 0 | {-3} | 0 | {-4} | 0 0 0 0 0 0 e -d c b | {-4} | 0 0 0 e 0 0 -d 0 c | {-3} | 0 | {-3} | 0 | {-3} | 0 | {-3} | 0 | {-3} | 0 | {-3} | 0 | {-3} | 1 | -2 : subquotient ({-3} | c b a 0 0 0 0 |, {-3} | -b a 0 0 0 0 |) <-------------- cokernel {-2} | b a | : -2 {-3} | d 0 0 b 0 a 0 | {-3} | 0 0 -b a 0 0 | {-2} | 1 | {-3} | 0 d 0 -c 0 0 0 | {-3} | -d 0 c 0 0 0 | {-2} | 0 | {-3} | 0 0 -d 0 0 c 0 | {-3} | 0 -d 0 c 0 0 | {-2} | 0 | {-3} | e 0 0 0 b 0 a | {-3} | 0 0 0 0 -b a | {-2} | 0 | {-3} | 0 e 0 0 -c 0 0 | {-3} | -e 0 0 0 c 0 | {-2} | 0 | {-3} | 0 0 -e 0 0 0 c | {-3} | 0 -e 0 0 0 c | {-2} | 0 | {-3} | 0 0 0 e -d 0 0 | {-3} | 0 0 -e 0 d 0 | {-2} | 0 | {-3} | 0 0 0 0 0 -e d | {-3} | 0 0 0 -e 0 d | o6 : ComplexMap |
i7 : assert isWellDefined g |
i8 : assert isComplexMorphism g |
i9 : assert (target g == C) |
i10 : assert (source g == D) |
i11 : g^-1 o11 = -4 : cokernel {-5} | e d c b a | <-------------- cokernel {-5} | -e d -c -b a | : -4 {-5} | 1 | -3 : cokernel {-3} | e d c | <-------------------------------- subquotient ({-4} | d c 0 b 0 0 a 0 0 0 |, {-4} | d -c -b a 0 0 0 0 0 |) : -3 {-3} | 0 0 0 0 0 0 0 0 0 1 | {-4} | e 0 c 0 b 0 0 a 0 0 | {-4} | e 0 0 0 -c -b a 0 0 | {-4} | 0 -e d 0 0 b 0 0 a 0 | {-4} | 0 e 0 0 -d 0 0 -b a | {-4} | 0 0 0 -e d -c 0 0 0 a | {-4} | 0 0 e 0 0 -d 0 c 0 | {-4} | 0 0 0 0 0 0 e -d c b | {-4} | 0 0 0 e 0 0 -d 0 c | -2 : cokernel {-2} | b a | <-------------------------- subquotient ({-3} | c b a 0 0 0 0 |, {-3} | -b a 0 0 0 0 |) : -2 {-2} | 1 0 0 0 0 0 0 | {-3} | d 0 0 b 0 a 0 | {-3} | 0 0 -b a 0 0 | {-3} | 0 d 0 -c 0 0 0 | {-3} | -d 0 c 0 0 0 | {-3} | 0 0 -d 0 0 c 0 | {-3} | 0 -d 0 c 0 0 | {-3} | e 0 0 0 b 0 a | {-3} | 0 0 0 0 -b a | {-3} | 0 e 0 0 -c 0 0 | {-3} | -e 0 0 0 c 0 | {-3} | 0 0 -e 0 0 0 c | {-3} | 0 -e 0 0 0 c | {-3} | 0 0 0 e -d 0 0 | {-3} | 0 0 -e 0 d 0 | {-3} | 0 0 0 0 0 -e d | {-3} | 0 0 0 -e 0 d | o11 : ComplexMap |
i12 : assert(g*g^-1 == 1 and g^-1*g == 1) |
The image of a map of complexes also becomes more understandable via pruning.
i13 : S = ZZ/101[a,b,c]; |
i14 : I = ideal(a^2,b^2,c^2); o14 : Ideal of S |
i15 : J = I + ideal(a*b*c); o15 : Ideal of S |
i16 : FI = freeResolution I 1 3 3 1 o16 = S <-- S <-- S <-- S 0 1 2 3 o16 : Complex |
i17 : FJ = freeResolution J 1 4 6 3 o17 = S <-- S <-- S <-- S 0 1 2 3 o17 : Complex |
i18 : f = randomComplexMap(FJ, FI ** S^{-1}, Cycle => true) 1 1 o18 = 0 : S <------------------- S : 0 | 32a-36b-30c | 4 3 1 : S <----------------------------------------------- S : 1 {2} | 32a-36b-30c 0 0 | {2} | 0 32a-36b-30c 0 | {2} | 0 0 32a-36b-30c | {3} | 0 0 0 | 6 3 2 : S <---------------------------------------------- S : 2 {4} | 32a-36b+42c -19c 19c | {4} | 29b+10c 19b-29c -19b+22c | {4} | -29a+29c -19a-24c 19a+8c | {4} | -10b 32a-7b-30c -22b | {4} | -10a-29b 29a+24b -22a-8b | {4} | -29a 24a 24a-36b-30c | 3 1 3 : S <------------------------------------ S : 3 {5} | 19a2+19b2+32ac-36bc+42c2 | {5} | -22a2-32ab+7b2+30bc-10c2 | {5} | 24a2-36ab-24b2-30ac-29c2 | o18 : ComplexMap |
i19 : C = image f o19 = image | 32a-36b-30c | <-- image {2} | 32a-36b-30c 0 0 | <-- image {4} | 32a-36b+42c -19c 19c | <-- image {5} | 19a2+19b2+32ac-36bc+42c2 | {2} | 0 32a-36b-30c 0 | {4} | 29b+10c 19b-29c -19b+22c | {5} | -22a2-32ab+7b2+30bc-10c2 | 0 {2} | 0 0 32a-36b-30c | {4} | -29a+29c -19a-24c 19a+8c | {5} | 24a2-36ab-24b2-30ac-29c2 | {3} | 0 0 0 | {4} | -10b 32a-7b-30c -22b | {4} | -10a-29b 29a+24b -22a-8b | 3 1 {4} | -29a 24a 24a-36b-30c | 2 o19 : Complex |
i20 : D = prune C 1 3 3 1 o20 = S <-- S <-- S <-- S 0 1 2 3 o20 : Complex |
i21 : g = D.cache.pruningMap 1 o21 = 0 : image | 32a-36b-30c | <------------- S : 0 {1} | 1 | 3 1 : image {2} | 32a-36b-30c 0 0 | <----------------- S : 1 {2} | 0 32a-36b-30c 0 | {3} | 1 0 0 | {2} | 0 0 32a-36b-30c | {3} | 0 1 0 | {3} | 0 0 0 | {3} | 0 0 1 | 3 2 : image {4} | 32a-36b+42c -19c 19c | <----------------- S : 2 {4} | 29b+10c 19b-29c -19b+22c | {5} | 1 0 0 | {4} | -29a+29c -19a-24c 19a+8c | {5} | 0 1 0 | {4} | -10b 32a-7b-30c -22b | {5} | 0 0 1 | {4} | -10a-29b 29a+24b -22a-8b | {4} | -29a 24a 24a-36b-30c | 1 3 : image {5} | 19a2+19b2+32ac-36bc+42c2 | <------------- S : 3 {5} | -22a2-32ab+7b2+30bc-10c2 | {7} | 1 | {5} | 24a2-36ab-24b2-30ac-29c2 | o21 : ComplexMap |
i22 : assert isWellDefined g |
i23 : assert isComplexMorphism g |
i24 : assert (target g == C) |
i25 : assert (source g == D) |
i26 : g^-1 1 o26 = 0 : S <------------- image | 32a-36b-30c | : 0 {1} | 1 | 3 1 : S <----------------- image {2} | 32a-36b-30c 0 0 | : 1 {3} | 1 0 0 | {2} | 0 32a-36b-30c 0 | {3} | 0 1 0 | {2} | 0 0 32a-36b-30c | {3} | 0 0 1 | {3} | 0 0 0 | 3 2 : S <----------------- image {4} | 32a-36b+42c -19c 19c | : 2 {5} | 1 0 0 | {4} | 29b+10c 19b-29c -19b+22c | {5} | 0 1 0 | {4} | -29a+29c -19a-24c 19a+8c | {5} | 0 0 1 | {4} | -10b 32a-7b-30c -22b | {4} | -10a-29b 29a+24b -22a-8b | {4} | -29a 24a 24a-36b-30c | 1 3 : S <------------- image {5} | 19a2+19b2+32ac-36bc+42c2 | : 3 {7} | 1 | {5} | -22a2-32ab+7b2+30bc-10c2 | {5} | 24a2-36ab-24b2-30ac-29c2 | o26 : ComplexMap |
i27 : assert(g*g^-1 == 1 and g^-1*g == 1) |
One can directly prune the map of complexes $f$.
i28 : h = prune f 1 1 o28 = 0 : S <------------------- S : 0 | 32a-36b-30c | 4 3 1 : S <----------------------------------------------- S : 1 {2} | 32a-36b-30c 0 0 | {2} | 0 32a-36b-30c 0 | {2} | 0 0 32a-36b-30c | {3} | 0 0 0 | 6 3 2 : S <---------------------------------------------- S : 2 {4} | 32a-36b+42c -19c 19c | {4} | 29b+10c 19b-29c -19b+22c | {4} | -29a+29c -19a-24c 19a+8c | {4} | -10b 32a-7b-30c -22b | {4} | -10a-29b 29a+24b -22a-8b | {4} | -29a 24a 24a-36b-30c | 3 1 3 : S <------------------------------------ S : 3 {5} | 19a2+19b2+32ac-36bc+42c2 | {5} | -22a2-32ab+7b2+30bc-10c2 | {5} | 24a2-36ab-24b2-30ac-29c2 | o28 : ComplexMap |
i29 : assert(source h === prune source f) |
i30 : assert(target h === prune target f) |