# canonicalTruncation(Complex,ZZ,ZZ) -- reducing the number of non-zero terms of a complex

## Synopsis

• Function: canonicalTruncation
• Usage:
canonicalTruncation(C, lo, hi)
• Inputs:
• C, ,
• lo, an integer, or -infinity or null (the latter two give no lower bound)
• hi, an integer, or infinity or null (the latter two give no upper bound)
• Outputs:
• ,

## Description

Returns a new complex which drops (sets to zero) all modules outside the given range, and modifies the ends to preserve homology in the given range.

 i1 : R = ZZ/101[a,b,c,d,e]; i2 : I = intersect(ideal(a,b),ideal(c,d,e)) o2 = ideal (b*e, a*e, b*d, a*d, b*c, a*c) o2 : Ideal of R i3 : C = (dual freeResolution I)[-4] 1 5 9 6 1 o3 = R <-- R <-- R <-- R <-- R 0 1 2 3 4 o3 : Complex i4 : C1 = canonicalTruncation(C, 1, 2) o4 = image {-4} | d c 0 b 0 0 a 0 0 0 | <-- cokernel {-3} | -b a 0 0 0 0 | {-4} | e 0 c 0 b 0 0 a 0 0 | {-3} | 0 0 -b a 0 0 | {-4} | 0 -e d 0 0 b 0 0 a 0 | {-3} | -d 0 c 0 0 0 | {-4} | 0 0 0 -e d -c 0 0 0 a | {-3} | 0 -d 0 c 0 0 | {-4} | 0 0 0 0 0 0 e -d c b | {-3} | 0 0 0 0 -b a | {-3} | -e 0 0 0 c 0 | 1 {-3} | 0 -e 0 0 0 c | {-3} | 0 0 -e 0 d 0 | {-3} | 0 0 0 -e 0 d | 2 o4 : Complex i5 : assert isWellDefined C1 i6 : HH C1 o6 = 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 |) {-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 | {-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 | {-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 | {-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 | {-3} | 0 e 0 0 -c 0 0 | {-3} | -e 0 0 0 c 0 | 1 {-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 | 2 o6 : Complex i7 : naiveTruncation(HH C, 1, 2) == HH C1 o7 = true i8 : prune HH C1 o8 = cokernel {-3} | e d c | <-- cokernel {-2} | b a | 1 2 o8 : Complex

We illustrate various possibilities for the truncation interval.

 i9 : C2 = canonicalTruncation(C, 1, 6) 9 6 1 o9 = image {-4} | d c 0 b 0 0 a 0 0 0 | <-- R <-- R <-- R {-4} | e 0 c 0 b 0 0 a 0 0 | {-4} | 0 -e d 0 0 b 0 0 a 0 | 2 3 4 {-4} | 0 0 0 -e d -c 0 0 0 a | {-4} | 0 0 0 0 0 0 e -d c b | 1 o9 : Complex i10 : assert isWellDefined C2 i11 : C3 = canonicalTruncation(C, 1, infinity) 9 6 1 o11 = image {-4} | d c 0 b 0 0 a 0 0 0 | <-- R <-- R <-- R {-4} | e 0 c 0 b 0 0 a 0 0 | {-4} | 0 -e d 0 0 b 0 0 a 0 | 2 3 4 {-4} | 0 0 0 -e d -c 0 0 0 a | {-4} | 0 0 0 0 0 0 e -d c b | 1 o11 : Complex i12 : C2 == C3 o12 = true i13 : C4 = canonicalTruncation(C, -13, 2) 1 5 o13 = R <-- R <-- cokernel {-3} | -b a 0 0 0 0 | {-3} | 0 0 -b a 0 0 | 0 1 {-3} | -d 0 c 0 0 0 | {-3} | 0 -d 0 c 0 0 | {-3} | 0 0 0 0 -b a | {-3} | -e 0 0 0 c 0 | {-3} | 0 -e 0 0 0 c | {-3} | 0 0 -e 0 d 0 | {-3} | 0 0 0 -e 0 d | 2 o13 : Complex i14 : C5 = canonicalTruncation(C, -infinity, 2) 1 5 o14 = R <-- R <-- cokernel {-3} | -b a 0 0 0 0 | {-3} | 0 0 -b a 0 0 | 0 1 {-3} | -d 0 c 0 0 0 | {-3} | 0 -d 0 c 0 0 | {-3} | 0 0 0 0 -b a | {-3} | -e 0 0 0 c 0 | {-3} | 0 -e 0 0 0 c | {-3} | 0 0 -e 0 d 0 | {-3} | 0 0 0 -e 0 d | 2 o14 : Complex i15 : C4 == C5 o15 = true i16 : C6 = canonicalTruncation(C, , 2) 1 5 o16 = R <-- R <-- cokernel {-3} | -b a 0 0 0 0 | {-3} | 0 0 -b a 0 0 | 0 1 {-3} | -d 0 c 0 0 0 | {-3} | 0 -d 0 c 0 0 | {-3} | 0 0 0 0 -b a | {-3} | -e 0 0 0 c 0 | {-3} | 0 -e 0 0 0 c | {-3} | 0 0 -e 0 d 0 | {-3} | 0 0 0 -e 0 d | 2 o16 : Complex i17 : C4 == C6 o17 = true

If the lower and upper bounds are equal in the canonical truncation, the resulting complex has a single nonzero term consisting of the homology in that location.

 i18 : assert(canonicalTruncation(C, 1, 1) == naiveTruncation(HH C, 1, 1))

If we truncate only from below, then we get an injection from the truncation into the original complex, whereas if we truncate only from above, we get a surjection onto the truncated complex.

 i19 : f = inducedMap(C, C3) 5 o19 = 1 : R <------------------------------------ image {-4} | d c 0 b 0 0 a 0 0 0 | : 1 {-4} | d c 0 b 0 0 a 0 0 0 | {-4} | e 0 c 0 b 0 0 a 0 0 | {-4} | e 0 c 0 b 0 0 a 0 0 | {-4} | 0 -e d 0 0 b 0 0 a 0 | {-4} | 0 -e d 0 0 b 0 0 a 0 | {-4} | 0 0 0 -e d -c 0 0 0 a | {-4} | 0 0 0 -e d -c 0 0 0 a | {-4} | 0 0 0 0 0 0 e -d c b | {-4} | 0 0 0 0 0 0 e -d c b | 9 9 2 : R <------------------------------ R : 2 {-3} | 1 0 0 0 0 0 0 0 0 | {-3} | 0 1 0 0 0 0 0 0 0 | {-3} | 0 0 1 0 0 0 0 0 0 | {-3} | 0 0 0 1 0 0 0 0 0 | {-3} | 0 0 0 0 1 0 0 0 0 | {-3} | 0 0 0 0 0 1 0 0 0 | {-3} | 0 0 0 0 0 0 1 0 0 | {-3} | 0 0 0 0 0 0 0 1 0 | {-3} | 0 0 0 0 0 0 0 0 1 | 6 6 3 : R <------------------------ R : 3 {-2} | 1 0 0 0 0 0 | {-2} | 0 1 0 0 0 0 | {-2} | 0 0 1 0 0 0 | {-2} | 0 0 0 1 0 0 | {-2} | 0 0 0 0 1 0 | {-2} | 0 0 0 0 0 1 | 1 1 4 : R <--------- R : 4 | 1 | o19 : ComplexMap i20 : assert isWellDefined f i21 : assert(ker f == 0) i22 : prune coker f 1 o22 = R <-- cokernel {-4} | d c 0 b 0 0 a 0 0 0 | {-4} | e 0 c 0 b 0 0 a 0 0 | 0 {-4} | 0 -e d 0 0 b 0 0 a 0 | {-4} | 0 0 0 -e d -c 0 0 0 a | {-4} | 0 0 0 0 0 0 e -d c b | 1 o22 : Complex i23 : C7 = canonicalTruncation(C, -infinity, 1) 1 o23 = R <-- cokernel {-4} | d -c -b a 0 0 0 0 0 | {-4} | e 0 0 0 -c -b a 0 0 | 0 {-4} | 0 e 0 0 -d 0 0 -b a | {-4} | 0 0 e 0 0 -d 0 c 0 | {-4} | 0 0 0 e 0 0 -d 0 c | 1 o23 : Complex i24 : C7 != coker f o24 = true
 i25 : g = inducedMap(C5, C) 1 1 o25 = 0 : R <-------------- R : 0 {-5} | 1 | 5 5 1 : R <---------------------- R : 1 {-4} | 1 0 0 0 0 | {-4} | 0 1 0 0 0 | {-4} | 0 0 1 0 0 | {-4} | 0 0 0 1 0 | {-4} | 0 0 0 0 1 | 9 2 : cokernel {-3} | -b a 0 0 0 0 | <------------------------------ R : 2 {-3} | 0 0 -b a 0 0 | {-3} | 1 0 0 0 0 0 0 0 0 | {-3} | -d 0 c 0 0 0 | {-3} | 0 1 0 0 0 0 0 0 0 | {-3} | 0 -d 0 c 0 0 | {-3} | 0 0 1 0 0 0 0 0 0 | {-3} | 0 0 0 0 -b a | {-3} | 0 0 0 1 0 0 0 0 0 | {-3} | -e 0 0 0 c 0 | {-3} | 0 0 0 0 1 0 0 0 0 | {-3} | 0 -e 0 0 0 c | {-3} | 0 0 0 0 0 1 0 0 0 | {-3} | 0 0 -e 0 d 0 | {-3} | 0 0 0 0 0 0 1 0 0 | {-3} | 0 0 0 -e 0 d | {-3} | 0 0 0 0 0 0 0 1 0 | {-3} | 0 0 0 0 0 0 0 0 1 | o25 : ComplexMap i26 : assert isWellDefined g i27 : assert(coker g == 0) i28 : C8 = canonicalTruncation(C, 2, infinity) 6 1 o28 = image {-3} | c b a 0 0 0 0 | <-- R <-- R {-3} | d 0 0 b 0 a 0 | {-3} | 0 d 0 -c 0 0 0 | 3 4 {-3} | 0 0 -d 0 0 c 0 | {-3} | e 0 0 0 b 0 a | {-3} | 0 e 0 0 -c 0 0 | {-3} | 0 0 -e 0 0 0 c | {-3} | 0 0 0 e -d 0 0 | {-3} | 0 0 0 0 0 -e d | 2 o28 : Complex i29 : prune C8 6 1 o29 = cokernel {-2} | b a | <-- R <-- R {-2} | -c 0 | {-2} | 0 -c | 3 4 {-2} | -d 0 | {-2} | -e 0 | {-2} | 0 -d | {-2} | 0 -e | 2 o29 : Complex i30 : prune ker g 6 1 o30 = cokernel {-2} | ac | <-- R <-- R {-2} | -bc | {-2} | ad | 3 4 {-2} | ae | {-2} | -bd | {-2} | -be | 2 o30 : Complex

There is another type of truncation, naiveTruncation, which yields a short exact sequence of complexes.