If M,N are S-modules annihilated by the elements of the matrix ff = (f_1..f_c), and k is the residue field of S, then the script exteriorExtModule(f,M) returns Ext_S(M, k) as a module over an exterior algebra E = k<e_1,...,e_c>, where the e_i have degree 1. It is computed as the E-dual of exteriorTorModule.
The script exteriorTorModule(f,M,N) returns Ext_S(M,N) as a module over a bigraded ring SE = S<e_1,..,e_c>, where the e_i have degrees {d_i,1}, where d_i is the degree of f_i. The module structure, in either case, is defined by the homotopies for the f_i on the resolution of M, computed by the script makeHomotopies1.The script calls makeModule to compute a (non-minimal) presentation of this module.
i1 : kk = ZZ/101 o1 = kk o1 : QuotientRing |
i2 : S = kk[a,b,c] o2 = S o2 : PolynomialRing |
i3 : f = matrix"a4,b4,c4"
o3 = | a4 b4 c4 |
1 3
o3 : Matrix S <--- S
|
i4 : R = S/ideal f o4 = R o4 : QuotientRing |
i5 : p = map(R,S)
o5 = map(R,S,{a, b, c})
o5 : RingMap R <--- S
|
i6 : M = coker map(R^2, R^{3:-1}, {{a,b,c},{b,c,a}})
o6 = cokernel | a b c |
| b c a |
2
o6 : R-module, quotient of R
|
i7 : betti (FF =res( M, LengthLimit =>6))
0 1 2 3 4 5 6
o7 = total: 2 3 4 6 9 13 18
0: 2 3 . . . . .
1: . . 1 . . . .
2: . . 3 3 . . .
3: . . . 3 3 . .
4: . . . . 3 3 .
5: . . . . 3 9 6
6: . . . . . . 3
7: . . . . . 1 9
o7 : BettiTally
|
i8 : MS = prune pushForward(p, coker FF.dd_6); |
i9 : resFld := pushForward(p, coker vars R); |
i10 : T = exteriorTorModule(f,MS); |
i11 : E = exteriorExtModule(f,MS); |
i12 : hf(-4..0,E)
o12 = {0, 9, 29, 33, 13}
o12 : List
|
i13 : betti res MS
0 1 2 3
o13 = total: 13 33 29 9
9: 3 . . .
10: 9 6 . .
11: . 3 . .
12: 1 15 . .
13: . 9 8 .
14: . . 6 .
15: . . 12 .
16: . . 3 3
17: . . . 3
18: . . . 3
o13 : BettiTally
|
i14 : betti res (PE = prune E)
0 1 2 3 4
o14 = total: 16 13 25 49 81
-3: 9 4 3 3 3
-2: 6 3 . . .
-1: . . 7 18 33
0: 1 6 15 28 45
o14 : BettiTally
|
i15 : betti res (PT = prune T)
0 1 2 3 4
o15 = total: 31 55 87 127 175
0: 13 24 39 58 81
1: 18 31 48 69 94
o15 : BettiTally
|
i16 : E1 = prune exteriorExtModule(f, MS, resFld); |
i17 : ring E1
o17 = kk[X ..X , e ..e ]
0 2 0 2
o17 : PolynomialRing, 3 skew commutative variables
|
i18 : exRing = kk[e_0,e_1,e_2, SkewCommutative =>true] o18 = exRing o18 : PolynomialRing, 3 skew commutative variables |
We can also construct the exteriorExtModule as a bigraded module, over a ring SE that has both polynomial variables like S and exterior variables like E. The polynomial variables have degrees {1,0}. The exterior variables have degrees {deg ff_i, 1}.
i19 : E1 = prune exteriorExtModule(f, MS, resFld); |
i20 : ring E1
o20 = kk[X ..X , e ..e ]
0 2 0 2
o20 : PolynomialRing, 3 skew commutative variables
|
i21 : exRing = kk[e_0,e_1,e_2, SkewCommutative =>true] o21 = exRing o21 : PolynomialRing, 3 skew commutative variables |
To see that this is really the same module, with a more complex grading, we can bring it over to a pure exterior algebra. Note that the necessary map of rings must contain a DegreeMap option. In general we could only take the degrees of the generators of the exterior algebra to be the gcd of the deg ff_i ; in the example above this is 1.
i22 : q = map(exRing, ring E1, {3:0,e_0,e_1,e_2}, DegreeMap => d -> {d_1})
o22 = map(exRing,kk[X ..X , e ..e ],{0, 0, 0, e , e , e })
0 2 0 2 0 1 2
o22 : RingMap exRing <--- kk[X ..X , e ..e ]
0 2 0 2
|
i23 : E2 = coker q presentation E1; |
i24 : hf(-5..5,E2) == hf(-5..5,E) o24 = true |
The object exteriorExtModule is a method function.