This is frequently useful to make the output of certain operations readable or understandable.
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 : h = 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*h == 1 and h*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 : h = 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*h == 1 and h*g == 1) |