Let Rbar = R/(f1..fc), a complete intersection of codimension c, and let M,N be Rbar-modules. We assume that the pushForward of M to R has finite free resolution. The script then computes the total Ext(M,N) as a module over S = kk(s_1..s_c,gens R), using EisenbudShamashTotal.
If Check => true, then the result is compared with the built-in global Ext written by Avramov and Grayson (but note the difference, explained below).
If Lift => false the result is returned over and extension of Rbar; if Lift => true the result is returned over and extension of R.
If Grading => 2, the default, then the result is bigraded (this is necessary when Check=>true
The default Variables => symbol "s" gives the new variables the name s_i, i=0..c-1. (note that the builtin Ext uses X_1..X_c.
On Some examples newExt is faster than Ext; on others it's slower.
A simple example: if R = k[x_1..x_n] and I is contained in the cube of the maximal ideal, then Ext(k,k) is a free S/(x_1..x_n) = k[s_0..s_(c-1)]- module with binomial(n,i) generators in degree i
i1 : n = 3;c=2; |
i3 : R = ZZ/101[x_0..x_(n-1)] o3 = R o3 : PolynomialRing |
i4 : Rbar = R/(ideal apply(c, i-> R_i^3)) o4 = Rbar o4 : QuotientRing |
i5 : Mbar = Nbar = coker vars Rbar o5 = cokernel | x_0 x_1 x_2 | 1 o5 : Rbar-module, quotient of Rbar |
i6 : E = newExt(Mbar,Nbar) o6 = cokernel {0, 0} | x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {-2, -2} | 0 0 0 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 | {-2, -2} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 | {-2, -2} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 | {-1, -1} | 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {-1, -1} | 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {-1, -1} | 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 0 0 0 | {-3, -3} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 | ZZ / ZZ \ ---[s ..s , x ..x ] |---[s ..s , x ..x ]| 101 0 1 0 2 |101 0 1 0 2 |8 o6 : --------------------module, quotient of |-------------------| 3 3 | 3 3 | (x , x ) | (x , x ) | 0 1 \ 0 1 / |
i7 : tally degrees E o7 = Tally{{-1, -1} => 3} {-2, -2} => 3 {-3, -3} => 1 {0, 0} => 1 o7 : Tally |
i8 : annihilator E o8 = ideal (x , x , x ) 2 1 0 ZZ ---[s ..s , x ..x ] 101 0 1 0 2 o8 : Ideal of ------------------- 3 3 (x , x ) 0 1 |
An example where the built-n global Ext is hard to compare directly with our method of computation: I *guess* that the sign choices in the built-in amount essentially to a change of variable in the new variables, and spoil an easy comparison. But for example the bi-graded betti numbers are equal. this seems to start with c=3.
i9 : setRandomSeed 0 o9 = 0 |
i10 : n = 3 o10 = 3 |
i11 : c = 3 o11 = 3 |
i12 : kk = ZZ/101 o12 = kk o12 : QuotientRing |
i13 : R = kk[x_0..x_(n-1)] o13 = R o13 : PolynomialRing |
i14 : I = ideal apply(c, i->R_i^2) 2 2 2 o14 = ideal (x , x , x ) 0 1 2 o14 : Ideal of R |
i15 : ff = gens I o15 = | x_0^2 x_1^2 x_2^2 | 1 3 o15 : Matrix R <--- R |
i16 : Rbar = R/I o16 = Rbar o16 : QuotientRing |
i17 : bar = map(Rbar, R) o17 = map (Rbar, R, {x , x , x }) 0 1 2 o17 : RingMap Rbar <--- R |
i18 : K = coker vars Rbar o18 = cokernel | x_0 x_1 x_2 | 1 o18 : Rbar-module, quotient of Rbar |
i19 : Mbar = prune coker random(Rbar^2, Rbar^{-2,-2}) o19 = cokernel | x_0x_1+15x_0x_2+38x_1x_2 45x_0x_2+29x_1x_2 | | 35x_0x_2-30x_1x_2 x_0x_1-10x_0x_2-22x_1x_2 | 2 o19 : Rbar-module, quotient of Rbar |
i20 : ES = newExt(Mbar,K,Lift => true) o20 = cokernel {0, 0} | x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 s_2 s_1 s_0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {0, 0} | 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 s_2 s_1 s_0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {-2, -3} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 s_0-11s_1-40s_2 -s_1 9s_1-23s_2 17s_1 0 0 | {-2, -3} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 45s_1-35s_2 38s_1 s_0-7s_1+15s_2 s_1 0 0 | {-2, -3} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 -10s_1-26s_2 s_0+49s_1-40s_2 34s_1+4s_2 9s_1-23s_2 0 0 | {-2, -3} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 50s_1-s_2 45s_1-35s_2 10s_1+26s_2 s_0-48s_1+15s_2 0 0 | {-1, -2} | 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s_0^2+42s_0s_1-30s_1^2-25s_0s_2-35s_1s_2+9s_2^2 0 | {-1, -2} | 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s_0^2+42s_0s_1-30s_1^2-25s_0s_2-35s_1s_2+9s_2^2 | 8 o20 : kk[s ..s , x ..x ]-module, quotient of (kk[s ..s , x ..x ]) 0 2 0 2 0 2 0 2 |
i21 : S = ring ES o21 = S o21 : PolynomialRing |
compare with the built-in Ext
i22 : EE = Ext(Mbar,K); |
i23 : S' = ring EE -- note that S' is the polynomial ring o23 = S' o23 : PolynomialRing |
The two verstions of Ext appear to be the same up to change of variables:
i24 : A = res ES 8 36 66 64 36 12 2 o24 = S <-- S <-- S <-- S <-- S <-- S <-- S <-- 0 0 1 2 3 4 5 6 7 o24 : ChainComplex |
i25 : B = res EE 8 36 66 64 36 12 2 o25 = S' <-- S' <-- S' <-- S' <-- S' <-- S' <-- S' <-- 0 0 1 2 3 4 5 6 7 o25 : ChainComplex |
i26 : all(length A+1, i-> sort degrees A_i == sort degrees B_i) o26 = true |
but they have apparently different annihilators
i27 : ann EE 2 2 2 o27 = ideal (x , x , x , X + 41X X - 37X - 14X X - 29X X + 45X ) 2 1 0 1 1 2 2 1 3 2 3 3 o27 : Ideal of S' |
i28 : ann ES 2 2 2 o28 = ideal (x , x , x , s + 42s s - 30s - 25s s - 35s s + 9s ) 2 1 0 0 0 1 1 0 2 1 2 2 o28 : Ideal of S |
and in fact they are not isomorphic:
i29 : EEtoES = map(ring ES,ring EE, gens ring ES) o29 = map (S, S', {s , s , s , x , x , x }) 0 1 2 0 1 2 o29 : RingMap S <--- S' |
i30 : EE' = coker EEtoES presentation EE o30 = cokernel {0, 0} | x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 s_2 s_1 s_0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {0, 0} | 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 s_2 s_1 s_0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {-1, -2} | 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s_0^2+41s_0s_1-37s_1^2-14s_0s_2-29s_1s_2+45s_2^2 0 | {-1, -2} | 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s_0^2+41s_0s_1-37s_1^2-14s_0s_2-29s_1s_2+45s_2^2 | {-2, -3} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 0 0 0 s_0-18s_1-32s_2 -27s_1+25s_2 42s_1 -22s_1 0 0 | {-2, -3} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 0 0 0 23s_1-41s_2 s_0-42s_1+18s_2 -45s_1 -42s_1 0 0 | {-2, -3} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 0 0 0 -42s_2 22s_2 s_0-18s_1-32s_2 -27s_1+25s_2 0 0 | {-2, -3} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x_2 x_1 x_0 45s_2 42s_2 23s_1-41s_2 s_0-42s_1+18s_2 0 0 | 8 o30 : S-module, quotient of S |
i31 : H = Hom(EE',ES); |
i32 : Q = positions(degrees target presentation H, i-> i == {0,0}) o32 = {8, 9, 10, 11} o32 : List |
i33 : f = sum(Q, p-> random (S^1, S^1)**homomorphism H_{p}) o33 = {0, 0} | -38 39 0 0 0 0 0 0 | {0, 0} | -16 21 0 0 0 0 0 0 | {-2, -3} | 0 0 0 0 0 0 0 0 | {-2, -3} | 0 0 0 0 0 0 0 0 | {-2, -3} | 0 0 0 0 0 0 0 0 | {-2, -3} | 0 0 0 0 0 0 0 0 | {-1, -2} | 0 0 0 0 0 0 0 0 | {-1, -2} | 0 0 0 0 0 0 0 0 | o33 : Matrix |
If EE and ES were isomorphic, we would expect coker f to be 0, and it's not. prune coker f
The object newExt is a method function with options.