# minimalPresentation(Complex) -- minimal presentation of all terms in a complex

## Synopsis

• Function: minimalPresentation
• Usage:
D = minimalPresentation C
D = prune C
h = minimalPresentation f
h = prune f
• Inputs:
• C, , or $f$
• Optional inputs:
• Exclude => ..., default value {}, unused
• Outputs:
• D, , isomorphic to the input, where each term is replaced by a minimally presented model, or $h$ where the source and target are minimally presented
• Consequences:
• The isomorphism $g : D \to C$ is available as g = D.cache.pruningMap. The inverse isomorphism can be obtained as g^-1

## Description

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)