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.