Macaulay2 » Documentation
Packages » Complexes :: isNullHomotopyOf(ComplexMap,ComplexMap)
next | previous | forward | backward | up | index | toc

# isNullHomotopyOf(ComplexMap,ComplexMap) -- whether the first map of chain complexes is a null homotopy for the second

- Function: isNullHomotopyOf
- Usage:
    `isNullHomotopyOf(h, f)`
- Inputs:
  - h, a map of complexes,
  - f, a map of complexes,
- Outputs:
  - a Boolean value, that is true when $h$ is a null homotopy of $f$

## Description

A map of chain complexes $f \colon C \to D$ is null-homotopic 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 = M <-- M

         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)
    fails to be a null homotopy at location 0
    fails to be a null homotopy at location 1

    i17 : assert not isNullHomotopyOf(g2, f)
    expected degree of first map to be one more than degree of the second

## See also

- Basic invariants and properties -- information about accessing basic features
- isNullHomotopic(ComplexMap) -- whether a map of complexes is null-homotopic
- nullHomotopy(ComplexMap) -- a map which is a candidate for being a null homotopy
- randomComplexMap -- a random map of chain complexes
- Hom(Complex,Complex) -- the complex of homomorphisms between two complexes

## Ways to use this method:

- isNullHomotopyOf(ComplexMap,ComplexMap) -- whether the first map of chain complexes is a null homotopy for the second

The source of this document is in /build/macaulay2-88fgJW/macaulay2-1.25.11+ds/M2/Macaulay2/packages/Complexes/ChainComplexMapDoc.m2:3293:0.