A map of chain complexes $f \colon C \to D$ is null-homopic if there exists a map of chain complexes $h : C \to D$ of degree $\deg(f)+1$, such that we have the equality \[ f = \operatorname{dd}^D h + (-1)^{\deg(f)} h \operatorname{dd}^C. \]
As a first example, we construct a map of chain complexes in which the null homotopy is given by the identity.
i1 : R = ZZ/101[x,y,z]; |
i2 : M = cokernel matrix{{x,y,z^2}, {y^2,z,x^2}} o2 = cokernel | x y z2 | | y2 z x2 | 2 o2 : R-module, quotient of R |
i3 : C = complex {id_M} o3 = cokernel | x y z2 | <-- cokernel | x y z2 | | y2 z x2 | | y2 z x2 | 0 1 o3 : Complex |
i4 : h = map(C, C, i -> if i == 0 then id_M, Degree => 1) o4 = 1 : cokernel | x y z2 | <----------- cokernel | x y z2 | : 0 | y2 z x2 | | 1 0 | | y2 z x2 | | 0 1 | o4 : ComplexMap |
i5 : isWellDefined h o5 = true |
i6 : assert isNullHomotopyOf(h, id_C) |
i7 : assert isNullHomotopic id_C |
A random map of chain complexes, arising as a boundary in the associated Hom complex, is automatically null homotopic. We use the method nullHomotopy to construct a witness and verify it is a null homotopy.
i8 : C = (freeResolution M) ** R^1/ideal(x^3, z^3-x) o8 = cokernel | x3 z3-x 0 0 | <-- cokernel {1} | x3 z3-x 0 0 0 0 | <-- cokernel {5} | x3 z3-x | | 0 0 x3 z3-x | {2} | 0 0 x3 z3-x 0 0 | {2} | 0 0 0 0 x3 z3-x | 2 0 1 o8 : Complex |
i9 : f = randomComplexMap(C, C[1], Boundary => true) o9 = -1 : 0 <----- cokernel | x3 z3-x 0 0 | : -1 0 | 0 0 x3 z3-x | 0 : cokernel | x3 z3-x 0 0 | <-------------------------------------------------------------------------- cokernel {1} | x3 z3-x 0 0 0 0 | : 0 | 0 0 x3 z3-x | | -5y+30z 30x2+19xy-10y2-29yz-32z2-22x -29xy+6y2-38yz-16z2+15x | {2} | 0 0 x3 z3-x 0 0 | | 36y+48z 21x2-22y2+19xz-10yz+7z2 -16x2-33y2-29xz-24yz-38z2+36x | {2} | 0 0 0 0 x3 z3-x | 1 : cokernel {1} | x3 z3-x 0 0 0 0 | <---------------------------------------------------------------------------------- cokernel {5} | x3 z3-x | : 1 {2} | 0 0 x3 z3-x 0 0 | {1} | 24x2y2+19xy3-10y4+38x2yz-29y3z-19y2z2-19x2z+10xyz+29xz2-29x2-24xy-38xz | {2} | 0 0 0 0 x3 z3-x | {2} | 16x2y-8y3+8xz-16x | {2} | -39x2y-22y3+22xz+39x | o9 : ComplexMap |
i10 : assert isNullHomotopic f |
i11 : h = nullHomotopy f o11 = 0 : cokernel | x3 z3-x 0 0 | <---------------------------- cokernel | x3 z3-x 0 0 | : -1 | 0 0 x3 z3-x | | 24 -30 | | 0 0 x3 z3-x | | 39x2yz-36 -39x2y2-29 | 1 : cokernel {1} | x3 z3-x 0 0 0 0 | <--------------------------------------- cokernel {1} | x3 z3-x 0 0 0 0 | : 0 {2} | 0 0 x3 z3-x 0 0 | {1} | 19 19x-10y-29z -29x-24y-38z | {2} | 0 0 x3 z3-x 0 0 | {2} | 0 0 0 0 x3 z3-x | {2} | 0 -8 -16 | {2} | 0 0 0 0 x3 z3-x | {2} | 0 -22 -39x2y2+39 | 2 : cokernel {5} | x3 z3-x | <----- cokernel {5} | x3 z3-x | : 1 0 o11 : ComplexMap |
i12 : assert isNullHomotopyOf(h, f) |
By assigning debugLevel a positive value, this method provides some information about the nature of the failure to be a null homotopy.
i13 : g1 = randomComplexMap(C, C[1], Degree => 1) o13 = 0 : cokernel | x3 z3-x 0 0 | <-------------- cokernel | x3 z3-x 0 0 | : -1 | 0 0 x3 z3-x | | 21 19 | | 0 0 x3 z3-x | | 34 -47 | 1 : cokernel {1} | x3 z3-x 0 0 0 0 | <---------------------------------------- cokernel {1} | x3 z3-x 0 0 0 0 | : 0 {2} | 0 0 x3 z3-x 0 0 | {1} | -39 -18x-13y-43z -47x+38y+2z | {2} | 0 0 x3 z3-x 0 0 | {2} | 0 0 0 0 x3 z3-x | {2} | 0 -15 16 | {2} | 0 0 0 0 x3 z3-x | {2} | 0 -28 22 | 2 : cokernel {5} | x3 z3-x | <-------------- cokernel {5} | x3 z3-x | : 1 {5} | 45 | o13 : ComplexMap |
i14 : g2 = randomComplexMap(C, C[1], Degree => -1) o14 = -2 : 0 <----- cokernel | x3 z3-x 0 0 | : -1 0 | 0 0 x3 z3-x | -1 : 0 <----- cokernel {1} | x3 z3-x 0 0 0 0 | : 0 0 {2} | 0 0 x3 z3-x 0 0 | {2} | 0 0 0 0 x3 z3-x | 0 : cokernel | x3 z3-x 0 0 | <--------------------------------------------------------------------- cokernel {5} | x3 z3-x | : 1 | 0 0 x3 z3-x | | -34x2y3+47xy4+7y5-48x2y2z+19xy3z+15y4z-47x2yz2-16xy2z2-23y3z2 | | 39x2y3-11xy4+35y5+43x2y2z+48xy3z+11y4z-17x2yz2+36xy2z2-38y3z2 | o14 : ComplexMap |
i15 : debugLevel = 1 o15 = 1 |
i16 : assert not isNullHomotopyOf(g1, f) -- 1 : (ContainmentHooks) with Strategy => Inhomogeneous from -*Function[/usr/share/Macaulay2/Core/modules2.m2:332:61-332:99]*- -- 1 : (ContainmentHooks) with Strategy => Inhomogeneous from -*Function[/usr/share/Macaulay2/Core/modules2.m2:332:61-332:99]*- -- 1 : (ContainmentHooks) with Strategy => Inhomogeneous from -*Function[/usr/share/Macaulay2/Core/modules2.m2:332:61-332:99]*- -- 1 : (ContainmentHooks) with Strategy => Inhomogeneous from -*Function[/usr/share/Macaulay2/Core/modules2.m2:332:61-332:99]*- -- 1 : (ContainmentHooks) with Strategy => Inhomogeneous from -*Function[/usr/share/Macaulay2/Core/modules2.m2:332:61-332:99]*- -- 1 : (ContainmentHooks) with Strategy => Inhomogeneous from -*Function[/usr/share/Macaulay2/Core/modules2.m2:332:61-332:99]*- -- 1 : (ReduceHooks) with Strategy => Default from -*Function[/usr/share/Macaulay2/Core/matrix.m2:76:55-76:85]*- -- 1 : (ReduceHooks) with Strategy => Default from -*Function[/usr/share/Macaulay2/Core/matrix.m2:76:55-76:85]*- -- 1 : (ReduceHooks) with Strategy => Default from -*Function[/usr/share/Macaulay2/Core/matrix.m2:76:55-76:85]*- -- 1 : (ReduceHooks) with Strategy => Default from -*Function[/usr/share/Macaulay2/Core/matrix.m2:76:55-76:85]*- -- 1 : (ReduceHooks) with Strategy => Default from -*Function[/usr/share/Macaulay2/Core/matrix.m2:76:55-76:85]*- -- 1 : (ReduceHooks) with Strategy => Default from -*Function[/usr/share/Macaulay2/Core/matrix.m2:76:55-76:85]*- fails to be a null homotopy at location 0 fails to be a null homotopy at location 1 |
i17 : assert not isNullHomotopyOf(g2, f) -- 1 : (ContainmentHooks) with Strategy => Inhomogeneous from -*Function[/usr/share/Macaulay2/Core/modules2.m2:332:61-332:99]*- -- 1 : (ContainmentHooks) with Strategy => Inhomogeneous from -*Function[/usr/share/Macaulay2/Core/modules2.m2:332:61-332:99]*- -- 1 : (ContainmentHooks) with Strategy => Inhomogeneous from -*Function[/usr/share/Macaulay2/Core/modules2.m2:332:61-332:99]*- -- 1 : (ContainmentHooks) with Strategy => Inhomogeneous from -*Function[/usr/share/Macaulay2/Core/modules2.m2:332:61-332:99]*- -- 1 : (ContainmentHooks) with Strategy => Inhomogeneous from -*Function[/usr/share/Macaulay2/Core/modules2.m2:332:61-332:99]*- -- 1 : (ContainmentHooks) with Strategy => Inhomogeneous from -*Function[/usr/share/Macaulay2/Core/modules2.m2:332:61-332:99]*- expected degree of first map to be one more than degree of the second |