If M,N are S-modules annihilated by the elements of the matrix ff = (f1..fc), and k is the residue field of S, then the script exteriorExtModule(f,M) returns ExtS(M, k) as a module over an exterior algebra E = k<e1,...,ec>, where the ei have degree 1. It is computed as the E-dual of exteriorTorModule.
The script exteriorTorModule(f,M,N) returns ExtS(M,N) as a module over a bigraded ring SE = S<e1,..,ec>, where the ei have degrees di,1, where di is the degree of fi. The module structure, in either case, is defined by the homotopies for the fi 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 , X , e , e , e ] 0 1 2 0 1 2 o17 : PolynomialRing |
i18 : exRing = kk[e_0,e_1,e_2, SkewCommutative =>true] o18 = exRing o18 : PolynomialRing |
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 ffi, 1.
i19 : E1 = prune exteriorExtModule(f, MS, resFld); |
i20 : ring E1 o20 = kk[X , X , X , e , e , e ] 0 1 2 0 1 2 o20 : PolynomialRing |
i21 : exRing = kk[e_0,e_1,e_2, SkewCommutative =>true] o21 = exRing o21 : PolynomialRing |
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 ffi ; 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 , X , e , e , e ],{0, 0, 0, e , e , e }) 0 1 2 0 1 2 0 1 2 o22 : RingMap exRing <--- kk[X , X , X , e , e , e ] 0 1 2 0 1 2 |
i23 : E2 = coker q presentation E1; |
i24 : hf(-5..5,E2) == hf(-5..5,E) o24 = true |