This method provides another representation of the direct image complex.
Let M represent a coherent sheaf G on Y, and let \pi:Y\to P^r be a Noether normalization of Y. Note that \pi is chosen among finite linear projections P^m\to P^r from certain coordinate planes. Each coordinate y_i of P^m gives a multiplication map G\to G(1), and its induced map \pi_{*}G\to (\pi_{*}G)(1). Note that these induced maps provide an O_Y-module structure on \pi_{*}G, in other words, we may recover the O_Y-module F from \pi_{*}G and this action.
If no map is specified, it computes the complex C on P^r and a list of induced maps between chain complexes C\to C(1) on P^r associated to the multiplication by y_0,...,y_m, where C represents the Beilinson monad of \pi_{*}G (or R\pi_{*}U(T)).
If a map is specified by a matrix phi, then it computes the complex C on P^r and a list of induced maps between chain complexes C\to C(1) on P^r associated to the multiplication by y_0,...,y_m, where C represents the Beilinson monad of R(\pi \cdot phi)_{*}F.
When n is quite big compared to r, it is not very efficient to deal with Beilinson bundles on P^n since they have huge rank and presentation matrices. In particular, the method directImageComplex becomes slow down.
The following is an example of direct images of the structure sheaf on a twisted cubic.
i1 : kk=ZZ/101; d=6; |
i3 : needsPackage "Resultants"; |
i4 : vd=veronese(1,d,kk);
o4 : RingMap kk[t ..t ] <--- kk[x ..x ]
0 1 0 6
|
i5 : R=target vd; S=source vd; |
i7 : M=R^{1:-1}; I=ann M; J=ker vd;
o8 : Ideal of R
o9 : Ideal of S
|
i10 : RM=time directImageComplex(I,M,matrix vd); |
i11 : for i from min RM to max RM list (rank RM_i)
o11 = {36, 180, 360, 360, 180, 36}
o11 : List
|
RM looks complicated since it is consisted of universal bundles on P^6, which are of high rank.
i12 : retTable=time actionOnDirectImage(I,M,matrix vd);
We take a finite projection from P^n to P^d as {x , x } -- used 47.1632 seconds
0,0 0,6
|
i13 : keys retTable
o13 = {0}
o13 : List
|
We see that 0 is the only key, in other words, there is no other R^i vd_{*} except i=0. To see whether it gives an action on S/J, we can use the test function isAction.
Note that list retTable#i is consisted of maps of chain complexes R^i(\pi \cdot phi)_{*}(y_j) : C\to C(1) where C represents the direct image R^i(\pi \cdot phi)_{*}F. In general, it does not give a right action on C itself. The induced maps on cohomology groups provide a right action.
i14 : isAction(J, apply(dim S, i->prune HH^0 retTable#0#i)) o14 = true |
The following is a little more complicated example with nontrivial higher direct images. Let X be the product of two quartic curves C, and f : X \to C be the second projection. Let P, Q be two distinct points of C, and let L = O(P\times C + Q\times C + D) be a line bundle on X where D is the diagonal. We want to compute the higher direct images R^i f_{*}L. We choose C as the Fermat quartic, and choose P, Q as points on the intersection of C and the line V(x_2).
i15 : kk=ZZ/1009; |
i16 : (S,E)=productOfProjectiveSpaces({2,2},CoefficientField=>kk);
|
i17 : f1=S_0^4+S_1^4+S_2^4; f2=S_3^4+S_4^4+S_5^4; |
i19 : IX=ideal (f1,f2); o19 : Ideal of S |
i20 : P=matrix{{1,192,0}}; Q=matrix{{192,1,0}};
1 3
o20 : Matrix ZZ <--- ZZ
1 3
o21 : Matrix ZZ <--- ZZ
|
i22 : varX=matrix{{S_0,S_1,S_2}}; varY=matrix{{S_3,S_4,S_5}};
1 3
o22 : Matrix S <--- S
1 3
o23 : Matrix S <--- S
|
i24 : PX=P||varX; QX=Q||varX;
2 3
o24 : Matrix S <--- S
2 3
o25 : Matrix S <--- S
|
i26 : I1=ideal(f2, minors(2,PX)); -- ideal for P*C o26 : Ideal of S |
i27 : I2=ideal(f2, minors(2,QX)); -- ideal for Q*C o27 : Ideal of S |
i28 : I3=ideal(f1,f2, minors(2, varX||varY)); -- ideal for the diagonal D o28 : Ideal of S |
i29 : I=intersect(I1,I2,I3); -- ideal for P*C+Q*C+D o29 : Ideal of S |
i30 : SX=S/IX; Ldual=I/IX; |
i32 : betti (LX=Hom(Ldual, SX^1))
0 1
o32 = total: 10 26
0: 1 .
1: 1 1
2: . 1
3: 8 24
o32 : BettiTally
|
To compute its Tate resolution on the ambient space P^2 \times P^2, we first consider it as a sheaf on P^2 \times P^2, and then take a linear presentation matrix via a truncation.
i33 : phi = map(SX,S,vars SX); o33 : RingMap SX <--- S |
i34 : betti (L=prune pushForward(phi,LX))
0 1
o34 = total: 10 27
0: 1 .
1: 1 1
2: . 1
3: 8 25
o34 : BettiTally
|
i35 : Ltr = (truncate ({2,2},L))**S^{{2,2}};
|
i36 : betti res Ltr
0 1 2 3 4
o36 = total: 60 176 184 80 12
0: 60 176 184 80 12
o36 : BettiTally
|
We read off (a finite subquotient of) the Tate resolution of Rf_{*}L as follows.
i37 : Q=symExt(presentation Ltr, E);
184 60
o37 : Matrix E <--- E
|
i38 : T=(res (coker Q,LengthLimit=>12))**E^{{2,2}}[4];
|
i39 : cohomologyMatrix (T, -{5,5},{3,3})
o39 = | 0 0 0 0 0 0 0 96k 0 |
| 0 0 0 0 0 0 0 60k 88k |
| 60h 48h 36h 24h 12h 3h+3 12 0 0 |
| 36h2+20h 28h2+16h 20h2+12h 12h2+8h 4h2+4h 5h+1 12h+4 0 0 |
| 92h2 72h2 52h2 32h2 12h2 8h 28h 0 0 |
| 168h2 132h2 96h2 60h2 24h2 12h 48h 0 0 |
| 244h2 192h2 140h2 88h2 36h2 16h 68h 0 0 |
| 320h2 252h2 184h2 116h2 48h2 20h 88h 0 0 |
| 396h2 312h2 228h2 144h2 60h2 24h 108h 0 0 |
9 9
o39 : Matrix (ZZ[h, k]) <--- (ZZ[h, k])
|
i40 : sT=strand(T,{0,0},{0});
|
i41 : sTFull=new ChainComplex; |
i42 : sTFull.ring = ring sT; |
i43 : ma=6; |
i44 : sTFull=(dual res (coker transpose (sT[ma]).dd_0, LengthLimit=>2*ma))[-ma]; |
i45 : (S',E')=productOfProjectiveSpaces({2},CoefficientField=>kk);
|
i46 : projOnE=map(E', E, toList(3:0)|(gens E')); o46 : RingMap E' <--- E |
i47 : mi=min sTFull; ma=max sTFull; |
i49 : W=new ChainComplex; W.ring = E'; |
i51 : apply(toList(mi..ma),i-> W_i = E'^(-apply(degrees sTFull_i,d->d_{1})));
|
i52 : apply(toList(mi+1..ma),i->W.dd_i = map(W_(i-1),W_i,projOnE sTFull.dd_i)); |
i53 : betti W
-6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6
o53 = total: 24 20 16 12 9 8 9 12 16 20 24 28 32
0: 22 18 14 10 6 3 1 . . . . . .
1: 2 2 2 2 3 5 8 12 16 20 24 28 32
o53 : BettiTally
|
One can check that W has two strands (corresponding to R^0f_{*}L and R^1f_{*}L, respectively). By taking the Beilinson functor, one can check that R^0f_{*}L is the structure sheaf on C, and R^1f_{*}L is a torsion sheaf supported on two points lying on the intersection of C and the line V(x_2) other than P, Q.
i54 : R0fL = prune HH^0 beilinson W
o54 = cokernel | x_(0,0)^4+x_(0,1)^4+x_(0,2)^4 |
1
o54 : S'-module, quotient of S'
|
i55 : R1fL = prune HH^1 beilinson W
o55 = cokernel | -131x_(0,2) 0 0 0 x_(0,0) x_(0,1) 0 0 -131x_(0,2) 0 -131x_(0,2) 0 |
| x_(0,2) x_(0,1) x_(0,0) 0 0 0 0 0 0 0 0 0 |
| 0 0 0 x_(0,2) -x_(0,1) x_(0,0)+439x_(0,1) 0 0 0 0 0 0 |
| 0 0 0 0 0 0 x_(0,2) x_(0,1) x_(0,0) 0 0 0 |
| 0 0 0 0 0 0 0 0 0 x_(0,2) x_(0,1) x_(0,0) |
5
o55 : S'-module, quotient of S'
|
i56 : degree R0fL o56 = 4 |
i57 : primaryDecomposition ann R0fL
4 4 4
o57 = {ideal(x + x + x )}
0,0 0,1 0,2
o57 : List
|
i58 : degree R1fL o58 = 2 |
i59 : primaryDecomposition ann R1fL
2
o59 = {ideal (x , x + 247x ), ideal (x , x + 192x ), ideal (x , x , x )}
0,2 0,0 0,1 0,2 0,0 0,1 0,1 0,0 0,2
o59 : List
|
These module also can be seen as in the following way via a finite linear projection. We take a further projection \pi:C\to P^1, and check whether these modules induce an action on the direct image under \pi, in other words, provide {O_C}-module structures. As results, these actions make (the sheafification of) M0 and M1 into {O_C}-modules which are identical to R^0f_{*}L and R^1f_{*}L.
i60 : J=ideal (S'_0^4+S'_1^4+S'_2^4); o60 : Ideal of S' |
i61 : retTable=actionOnDirectImage(J,W);
We take a finite projection from P^n to P^d as {x , x }
0,1 0,2
|
i62 : keys retTable
o62 = {0, 1}
o62 : List
|
We see that 0, 1 appear as keys, in other words, both R^0f_{*}L and R^1f_{*}L survives.
i63 : prunedActionList = i->apply(dim S',j->prune HH^i retTable#i#j); |
i64 : apply(keys retTable, i->isAction(J,prunedActionList(i)))
o64 = {true, true}
o64 : List
|
i65 : M0=source (prunedActionList(0))_0
o65 = cokernel {2} | 0 -x_(0,1) 0 |
{2} | x_(0,0) 0 0 |
{2} | -x_(0,1) x_(0,0) 0 |
{2} | 0 0 0 |
{2} | 0 0 x_(0,0) |
{2} | 0 0 -x_(0,1) |
{3} | 0 0 0 |
7
o65 : kk[x ..x ]-module, quotient of (kk[x ..x ])
0,0 0,1 0,0 0,1
|
i66 : (rank M0, degree M0, betti res M0)
0 1
o66 = (4, 4, total: 7 3)
2: 6 3
3: 1 .
o66 : Sequence
|
i67 : isIsomorphic(truncate(regularity M0, M0), truncate(regularity M0, dual dual M0)) o67 = true |
i68 : dual dual M0
4
o68 = (kk[x ..x ])
0,0 0,1
o68 : kk[x ..x ]-module, free, degrees {3, 2, 1, 0}
0,0 0,1
|
i69 : M1=source (prunedActionList(1))_0
o69 = cokernel {2} | x_(0,1) 0 |
{2} | 0 x_(0,1) |
2
o69 : kk[x ..x ]-module, quotient of (kk[x ..x ])
0,0 0,1 0,0 0,1
|
i70 : (rank M1, degree M1, betti res M1)
0 1
o70 = (0, 2, total: 2 2)
2: 2 2
o70 : Sequence
|
Note that the sheafification of M0 (=R^0(\pi \cdot f)_{*}L) is a rank 4 vector bundle O \oplus O(-1) \oplus O(-2) \oplus O(-3) on P^1, and the sheafification of M1 (= R^1(\pi \cdot f)_{*} L) is a torsion sheaf on P^1 supported on the double point at [1:0]. Together with the induced action on S', they have an O_C-module structure as desired.
Note that the resulting complex is a chain complex instead of a cochain complex, so that for example HH^i RpiM = HH_{-i} RpiM. Also note that this requires a pseudo-inverse computation of a split exact sequence, which might fail over finite fields (see SVDComplexes.m2 and its documentations).
The object actionOnDirectImage is a method function.