# Sheaves on Projective Space

We present two algorithms for computing sheaf cohomology over projective $n$-space. The algorithms are based on Tate resolutions via the Bernstein-Gelfand-Gelfand-correspondence as introduced in [EFS03] and on local cohomology (see [Eis98]), respectively. While the first algorithm makes use of syzygy computations over the exterior algebra, the second algorithm is based on syzygy computations over the symmetric algebra (see [DE02] for a tutorial). Thus, in most examples, the first algorithm is much faster.

sheaf_cohomologyMethod
sheaf_cohomology(M::ModuleFP{T}, l::Int, h::Int; algorithm::Symbol = :bgg) where {T <: MPolyDecRingElem}

If M is a graded module over a standard graded multivariate polynomial ring with coefficients in a field K, say, and $\mathcal F = \widetilde{M}$ is the coherent sheaf associated to M on the corresponding projective space $\mathbb P^n(K)$, consider the cohomology groups $H^i(\mathbb P^n(K), \mathcal F(d))$ as vector spaces over $K$, and return their dimensions $h^i(\mathbb P^n(K), \mathcal F(d))$ in the range of twists $d$ indicated by l and h. The result is presented as a table, where '-' indicates that $h^i(\mathbb P^n(K), \mathcal F(d)) = 0$. The line starting with chi lists the Euler characteristic of each twist under consideration. The values in the table can be accessed as shown in the first example below. Note that this example addresses the cotangent bundle on projective 3-space, while the second example is concerned with the structure sheaf of projective 4-space.

The keyword algorithm can be set to

• :bgg (use the Tate resolution via the Bernstein-Gelfand-Gelfand correspondence),
• :loccoh (use local cohomology).
Note

Due to the shape of the Tate resolution, the algorithm addressed by bgg does not compute all values in the given range l $<$ h. The missing values are indicated by a *. To determine all values in the range l $<$ h, enter sheaf_cohomology(M, l-ngens(base_ring(M)), h+ngens(base_ring(M))).

julia> R, x = polynomial_ring(QQ, "x" => 1:4);

julia> I = ideal(S, gens(S))
Ideal generated by
x[1]
x[2]
x[3]
x[4]

julia> FI = free_resolution(I)
Free resolution of I
S^4 <---- S^6 <---- S^4 <---- S^1 <---- 0
0         1         2         3         4

julia> M = cokernel(map(FI, 2));

julia> tbl = sheaf_cohomology(M, -6, 2)
twist:  -6  -5  -4  -3  -2  -1   0   1   2
------------------------------------------
3:      70  36  15   4   -   -   -   -   *
2:       *   -   -   -   -   -   -   -   -
1:       *   *   -   -   -   -   1   -   -
0:       *   *   *   -   -   -   -   -   6
------------------------------------------
chi:     *   *   *   4   -   -   1   -   *

julia> tbl[0, 2]
6

julia> tbl[1, 0]
1

julia> sheaf_cohomology(M, -9, 5)
twist:   -9   -8   -7   -6   -5   -4   -3   -2   -1    0    1    2    3    4    5
---------------------------------------------------------------------------------
3:      280  189  120   70   36   15    4    -    -    -    -    -    *    *    *
2:        *    -    -    -    -    -    -    -    -    -    -    -    -    *    *
1:        *    *    -    -    -    -    -    -    -    1    -    -    -    -    *
0:        *    *    *    -    -    -    -    -    -    -    -    6   20   45   84
---------------------------------------------------------------------------------
chi:      *    *    *   70   36   15    4    -    -    1    -    6    *    *    *
julia> R, x = polynomial_ring(QQ, "x" => 1:5);

chi:    35  15   5   1   -   -   -   -   1   5  15  35