next | previous | forward | backward | up | top | index | toc | Macaulay2 website
CompleteIntersectionResolutions :: newExt

newExt -- Global Ext for modules over a complete Intersection

Synopsis

Description

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

See also

Ways to use newExt :

For the programmer

The object newExt is a method function with options.