Macaulay2 » Documentation
Packages » Complexes :: Strategy for free resolutions of homogeneous modules aided by Hilbert functions
next | previous | forward | backward | up | index | toc

# Strategy for free resolutions of homogeneous modules aided by Hilbert functions -- algorithm for computing free resolutions step by step aided by Hilbert functions

- Usage:
    `freeResolution(M, Strategy => 3)`
    `freeResolution(I, Strategy => 3)`
- Inputs:
  - M, a module, a homogeneous module over $S$, a (quotient of a) polynomial ring
  - I, an ideal, a homogeneous ideal in $S$
- Outputs:
  - a complex, a minimal free resolution of $M$ or $S^1/I$

## Description

This is one of the algorithms in the engine of Macaulay2 for computing minimal free resolutions. This is a variant when the ring $S$ is a homogeneous quotient of an almost commutative polynomial ring over a base field. In particular, this variant applies to homogeneous modules over a homogenized Weyl algebra or an exterior algebra.

This first example computes part of the minimal free resolution of the ground field over a hypersurface ring.

    i1 : kk = ZZ/32003;

    i2 : R = kk[a..d]/(a^2+b^2+c^2+d^2);

    i3 : I = ideal(a,b,c,d)

    o3 = ideal (a, b, c, d)

    o3 : Ideal of R

    i4 : M = R^1/I

    o4 = cokernel | a b c d |

                                1
    o4 : R-module, quotient of R

    i5 : F = freeResolution(M, Strategy => 3, LengthLimit => 5)

          1      4      7      8      8      8
    o5 = R  <-- R  <-- R  <-- R  <-- R  <-- R

         0      1      2      3      4      5

    o5 : Complex

    i6 : dd^F

              1                   4
    o6 = 0 : R  <--------------- R  : 1
                   | a b c d |

              4                                   7
         1 : R  <------------------------------- R  : 2
                   {1} | 0  0  -d 0  -c -b a |
                   {1} | 0  -d 0  -c 0  a  b |
                   {1} | -d 0  0  b  a  0  c |
                   {1} | c  b  a  0  0  0  d |

              7                                      8
         2 : R  <---------------------------------- R  : 3
                   {2} | b  a  0  0  c -d 0  0  |
                   {2} | -c 0  a  0  b 0  -d 0  |
                   {2} | 0  -c -b 0  a 0  0  -d |
                   {2} | d  0  0  a  0 b  -c 0  |
                   {2} | 0  d  0  -b 0 a  0  -c |
                   {2} | 0  0  d  c  0 0  a  -b |
                   {2} | 0  0  0  0  d c  b  a  |

              8                                      8
         3 : R  <---------------------------------- R  : 4
                   {3} | -a -b c  0  -d 0  0  0 |
                   {3} | b  -a 0  c  0  -d 0  0 |
                   {3} | -c 0  -a b  0  0  -d 0 |
                   {3} | d  0  0  0  -a b  -c 0 |
                   {3} | 0  -c -b -a 0  0  0  d |
                   {3} | 0  d  0  0  -b -a 0  c |
                   {3} | 0  0  d  0  c  0  -a b |
                   {3} | 0  0  0  d  0  c  b  a |

              8                                      8
         4 : R  <---------------------------------- R  : 5
                   {4} | a  -b c  0  -d 0  0  0 |
                   {4} | b  a  0  -c 0  d  0  0 |
                   {4} | -c 0  a  -b 0  0  d  0 |
                   {4} | 0  -c -b -a 0  0  0  d |
                   {4} | d  0  0  0  a  -b c  0 |
                   {4} | 0  d  0  0  -b -a 0  c |
                   {4} | 0  0  d  0  c  0  -a b |
                   {4} | 0  0  0  d  0  c  b  a |

    o6 : ComplexMap

    i7 : assert isWellDefined F

    i8 : assert isQuasiIsomorphism(augmentationMap F, Concentration => (0,4))

When the input is an ideal $I$, the free resolution of $R^1/I$ is returned.

    i9 : F1 = freeResolution(I, Strategy => 3, LengthLimit => 3)

          1      4      7      8
    o9 = R  <-- R  <-- R  <-- R

         0      1      2      3

    o9 : Complex

    i10 : assert(F1 == naiveTruncation(F,0,3))

    i11 : F2 = freeResolution(module I, Strategy => 3, LengthLimit => 3)

           4      7      8      8
    o11 = R  <-- R  <-- R  <-- R

          0      1      2      3

    o11 : Complex

    i12 : dd^F1

               1                   4
    o12 = 0 : R  <--------------- R  : 1
                    | a b c d |

               4                                   7
          1 : R  <------------------------------- R  : 2
                    {1} | 0  0  -d 0  -c -b a |
                    {1} | 0  -d 0  -c 0  a  b |
                    {1} | -d 0  0  b  a  0  c |
                    {1} | c  b  a  0  0  0  d |

               7                                      8
          2 : R  <---------------------------------- R  : 3
                    {2} | b  a  0  0  c -d 0  0  |
                    {2} | -c 0  a  0  b 0  -d 0  |
                    {2} | 0  -c -b 0  a 0  0  -d |
                    {2} | d  0  0  a  0 b  -c 0  |
                    {2} | 0  d  0  -b 0 a  0  -c |
                    {2} | 0  0  d  c  0 0  a  -b |
                    {2} | 0  0  0  0  d c  b  a  |

    o12 : ComplexMap

    i13 : dd^F2

               4                                   7
    o13 = 0 : R  <------------------------------- R  : 1
                    {1} | -b 0  -c a 0  0  -d |
                    {1} | a  -c 0  b 0  -d 0  |
                    {1} | 0  b  a  c -d 0  0  |
                    {1} | 0  0  0  d c  b  a  |

               7                                      8
          1 : R  <---------------------------------- R  : 2
                    {2} | 0  0  -c -d a  0  b  0 |
                    {2} | -d 0  -a 0  -c b  0  0 |
                    {2} | 0  -d b  0  0  a  c  0 |
                    {2} | 0  0  0  0  b  c  -a d |
                    {2} | -b -a 0  0  0  -d 0  c |
                    {2} | c  0  0  -a -d 0  0  b |
                    {2} | 0  c  0  b  0  0  d  a |

               8                                      8
          2 : R  <---------------------------------- R  : 3
                    {3} | a  -b -d 0  c  0  0  0 |
                    {3} | -b -a 0  0  0  0  -d c |
                    {3} | -d 0  -a 0  0  -c b  0 |
                    {3} | c  0  0  0  -a -d 0  b |
                    {3} | 0  0  -c -b -d a  0  0 |
                    {3} | 0  -d b  -c 0  0  a  0 |
                    {3} | 0  0  0  a  0  b  c  d |
                    {3} | 0  c  0  -d b  0  0  a |

    o13 : ComplexMap

This strategy also works when the underlying ring is simply a polynomial ring, but is often slower than Strategy 1. However, unlike Strategy 1, this strategy preserves the given presentation of the module, which can be desirable.

    i14 : S = kk[a..e]

    o14 = S

    o14 : PolynomialRing

    i15 : J = ideal(a^3-e^3, a*b^2-c*e^2, a*b*c, a*b*c + a^3 - e^3)

                  3    3     2      2          3            3
    o15 = ideal (a  - e , a*b  - c*e , a*b*c, a  + a*b*c - e )

    o15 : Ideal of S

    i16 : assert isHomogeneous J

    i17 : C2 = freeResolution(J, Strategy => 3)

           1      4      5      2
    o17 = S  <-- S  <-- S  <-- S

          0      1      2      3

    o17 : Complex

    i18 : C1 = freeResolution ideal J_*

           1      3      4      2
    o18 = S  <-- S  <-- S  <-- S

          0      1      2      3

    o18 : Complex

    i19 : assert isWellDefined C2

    i20 : betti C2

                 0 1 2 3
    o20 = total: 1 4 5 2
              0: 1 . . .
              1: . . 1 .
              2: . 4 . .
              3: . . . .
              4: . . 4 1
              5: . . . 1

    o20 : BettiTally

    i21 : betti C1

                 0 1 2 3
    o21 = total: 1 3 4 2
              0: 1 . . .
              1: . . . .
              2: . 3 . .
              3: . . . .
              4: . . 4 1
              5: . . . 1

    o21 : BettiTally

    i22 : assert(dd^C2_1 == gens J)

    i23 : assert(dd^C1_1 != gens J)

For completeness, we present an example over an exterior algebra.

    i24 : E = kk[a..d, SkewCommutative => true]

    o24 = E

    o24 : PolynomialRing, 4 skew commutative variable(s)

    i25 : I = ideal(a*b-c*d, a*b*c*d)

    o25 = ideal (a*b - c*d, a*b*c*d)

    o25 : Ideal of E

    i26 : M = E^1/I

    o26 = cokernel | ab-cd abcd |

                                 1
    o26 : E-module, quotient of E

    i27 : F = freeResolution(M, Strategy => 3, LengthLimit => 4)

           1      2      6      16      35
    o27 = E  <-- E  <-- E  <-- E   <-- E

          0      1      2      3       4

    o27 : Complex

    i28 : dd^F

               1                      2
    o28 = 0 : E  <------------------ E  : 1
                    | ab-cd abcd |

               2                                     6
          1 : E  <--------------------------------- E  : 2
                    {2} | bd ad bc ac ab+cd -cd |
                    {4} | 0  0  0  0  0     1   |

               6                                                 16
          2 : E  <--------------------------------------------- E   : 3
                    {4} | d 0 c 0 b a -a 0 0 0 0 0 0  0 c 0 |
                    {4} | 0 d 0 c 0 b 0  a 0 0 0 0 0  0 0 c |
                    {4} | 0 0 d 0 0 0 0  0 c 0 b a -a 0 0 0 |
                    {4} | 0 0 0 d 0 0 0  0 0 c 0 b 0  a 0 0 |
                    {4} | 0 0 0 0 0 0 d  0 0 0 0 0 c  0 b a |
                    {4} | 0 0 0 0 0 0 0  0 0 0 0 0 0  0 0 0 |

               16                                                                                          35
          3 : E   <-------------------------------------------------------------------------------------- E   : 4
                     {5} | d 0 c 0 -a 0 0 0  b a 0 0 c  0 0 0 0 0 0  0 0 0  0 0 0 0 0 0 0 0 0 0 0 0 0 |
                     {5} | 0 d 0 c 0  0 0 0  0 b 0 0 0  a 0 c 0 0 0  0 0 0  0 0 0 0 0 0 0 0 0 0 0 0 0 |
                     {5} | 0 0 d 0 0  c 0 -a 0 0 b a 0  0 0 0 0 0 0  0 0 0  0 0 0 0 0 0 0 0 0 0 0 0 0 |
                     {5} | 0 0 0 d 0  0 c 0  0 0 0 b 0  0 a 0 0 0 0  0 0 0  0 0 0 0 0 0 0 0 0 0 0 0 0 |
                     {5} | 0 0 0 0 0  0 0 0  d 0 c 0 -a 0 0 0 0 0 0  0 0 0  0 0 b a 0 0 c 0 0 0 0 0 0 |
                     {5} | 0 0 0 0 0  0 0 0  0 d 0 c 0  0 0 0 0 0 0  0 0 0  0 0 0 b 0 0 0 a 0 c 0 0 0 |
                     {5} | 0 0 0 0 d  0 0 c  0 0 0 0 b  0 0 a 0 0 0  0 0 0  0 0 0 0 0 0 0 0 0 0 0 0 0 |
                     {5} | 0 0 0 0 0  0 0 0  0 0 0 0 0  d c 0 0 0 0  0 0 0  0 0 0 0 0 0 0 b 0 0 a 0 c |
                     {5} | 0 0 0 0 0  d 0 0  0 0 0 0 0  0 0 0 c 0 -a b a 0  0 0 0 0 0 0 0 0 0 0 0 0 0 |
                     {5} | 0 0 0 0 0  0 d 0  0 0 0 0 0  0 0 0 0 c 0  0 b 0  a 0 0 0 0 0 0 0 0 0 0 0 0 |
                     {5} | 0 0 0 0 0  0 0 0  0 0 d 0 0  0 0 0 0 0 0  c 0 -a 0 0 0 0 b a 0 0 0 0 0 0 0 |
                     {5} | 0 0 0 0 0  0 0 0  0 0 0 d 0  0 0 0 0 0 0  0 c 0  0 0 0 0 0 b 0 0 a 0 0 0 0 |
                     {5} | 0 0 0 0 0  0 0 d  0 0 0 0 0  0 0 0 0 0 c  0 0 b  0 a 0 0 0 0 0 0 0 0 0 0 0 |
                     {5} | 0 0 0 0 0  0 0 0  0 0 0 0 0  0 d 0 0 0 0  0 0 0  c 0 0 0 0 0 0 0 b 0 0 a 0 |
                     {5} | 0 0 0 0 0  0 0 0  0 0 0 0 d  0 0 0 0 0 0  0 0 c  0 0 0 0 0 0 b 0 0 a 0 0 0 |
                     {5} | 0 0 0 0 0  0 0 0  0 0 0 0 0  0 0 d 0 0 0  0 0 0  0 c 0 0 0 0 0 0 0 b 0 0 a |

    o28 : ComplexMap

    i29 : assert isWellDefined F

    i30 : assert isQuasiIsomorphism(augmentationMap F, Concentration => (0,3))

This strategy works degree by degree. Within each degree, it first computes the syzygies of the presentation matrix, and then computes the second syzygies, and so on. This strategy uses Schreyer orders on the free modules in the resolution which often improves efficiency.

Although similar to Strategy 2, this strategy does use Hilbert functions to aid the computation.

## See also

- Strategies for free resolutions -- overview of the different algorithms for computing free resolutions
- freeResolution(Module) -- compute a free resolution of a module or ideal
- augmentationMap(Complex) -- map from a free resolution to a module regarded as a complex

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