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.