Cohomology of coherent sheaves

This module implements Maruyama’s method for computing the cohomology of coherent sheaves on projective schemes. This module is internal, and is not intended for direct use. Use cohomology() method of coherent sheaves on projective schemes.

Maruyama’s method is explained and proved in detail in [Kudo2017]. Here we summary the main results necessary to understand the implementation.

Let \(M\) be a graded module finitely generated over the homogeneous coordinate ring \(S\) of the projective \(r\)-space over a field \(k\). We aim for computing the cohomology groups \(H^q(\tilde M)\) for the coherent sheaf \(\tilde M\).

Let \(S=k[x_0,x_2,\dots,x_r]\). Then \(M\) is a quotient of the free module \(\bigoplus_{i=1}^{t}S\) by a submodule. Let

\[0\to\bigoplus_{j=1}^{t_{r+1}}S(-m^{(r+1)}_j)\overset{f_{r+1}}{\longrightarrow}\dots \overset{f_1}{\longrightarrow}\bigoplus_{j=1}^{t_0}S(-m^{(0)}_j)\overset{f_0}{\longrightarrow}M\to 0\]

be a minimal free resolution of \(M\). Then it induces a complex of (top) cohomology groups

\[\bigoplus_{j=1}^{t_{i+1}}H^r(\OO_{\PP^r}(-m^{(i+1)}_j))\overset{H^r(f_{i+1})}{\longrightarrow} \bigoplus_{j=1}^{t_i}H^r(\OO_{\PP^r}(-m^{(i)}_j))\overset{H^r(f_{i})}{\longrightarrow} \bigoplus_{j=1}^{t_{i-1}}H^r(\OO_{\PP^r}(-m^{(i-1)}_j)),\]

where \(i\) runs from \(1\) to \(r\). Now it holds that

\[H^q(\tilde M)\cong \ker H^r(f_{r-q})/\im H^r(f_{r-q+1})\]

for \(1\le q\le r - 1\) and

\[H^r(\tilde M)\cong \bigoplus_{j=1}^{t_0}H^r(\OO_{\PP^r}(-m^{(0)}_j))/\im H^r(f_1)\]

and \(\dim H^0(\tilde M)\) can be computed by the formula

\[\begin{split}\begin{split} &\dim \bigoplus_{j=1}^{t_{0}}H^0(\OO_{\PP^r}(-m^{(0)}_j)) -\dim \bigoplus_{j=1}^{t_{r+1}}H^r(\OO_{\PP^r}(-m^{(r+1)}_j)) +\dim \bigoplus_{j=1}^{t_{r}}H^r(\OO_{\PP^r}(-m^{(r)}_j)) \\ &\quad -\rank H^0(f_1)-\rank H^r(f_r) \end{split}\end{split}\]

in which the complex of (bottom) cohomology groups

\[\bigoplus_{j=1}^{t_{i+1}}H^0(\OO_{\PP^r}(-m^{(i+1)}_j))\overset{H^0(f_{i+1})}{\longrightarrow} \bigoplus_{j=1}^{t_i}H^0(\OO_{\PP^r}(-m^{(i)}_j))\overset{H^0(f_{i})}{\longrightarrow} \bigoplus_{j=1}^{t_{i-1}}H^0(\OO_{\PP^r}(-m^{(i-1)}_j)),\]

where \(i\) runs from \(1\) to \(r\) is used.

The implemented algorithm works more generally for twisted coherent sheaves and accepts as input shifted graded module \(M(-n)\) with shift \(n\).

EXAMPLES:

We define the Fermat cubic surface (a curve in \(\PP^2\)) and compute its cohomology groups:

sage: P2.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: X = P2.subscheme([x^4 + y^4 + z^4])
sage: sh = X.structure_sheaf()
sage: sh.cohomology(1)
3
>>> from sage.all import *
>>> P2 = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P2._first_ngens(3)
>>> X = P2.subscheme([x**Integer(4) + y**Integer(4) + z**Integer(4)])
>>> sh = X.structure_sheaf()
>>> sh.cohomology(Integer(1))
3

Internally the cohomology is computed by Maruyama’s method:

sage: sh._cohomology
Maruyama Method using S(0) <-- S(-4) <-- 0
sage: sh._cohomology.H(1)
Vector space quotient V/W of dimension 3 over Rational Field where
V: Vector space of degree 3 and dimension 3 over Rational Field
Basis matrix:
[1 0 0]
[0 1 0]
[0 0 1]
W: Vector space of degree 3 and dimension 0 over Rational Field
Basis matrix:
[]
sage: sh._cohomology.H(1).dimension() == sh.cohomology(1)
True
sage: sh.cohomology(2)
0
sage: sh._cohomology.H(2)
Vector space quotient V/W of dimension 0 over Rational Field where
V: Vector space of dimension 0 over Rational Field
W: Vector space of degree 0 and dimension 0 over Rational Field
Basis matrix:
[]
sage: sh._cohomology.H(2).dimension() == sh.cohomology(2)
True
>>> from sage.all import *
>>> sh._cohomology
Maruyama Method using S(0) <-- S(-4) <-- 0
>>> sh._cohomology.H(Integer(1))
Vector space quotient V/W of dimension 3 over Rational Field where
V: Vector space of degree 3 and dimension 3 over Rational Field
Basis matrix:
[1 0 0]
[0 1 0]
[0 0 1]
W: Vector space of degree 3 and dimension 0 over Rational Field
Basis matrix:
[]
>>> sh._cohomology.H(Integer(1)).dimension() == sh.cohomology(Integer(1))
True
>>> sh.cohomology(Integer(2))
0
>>> sh._cohomology.H(Integer(2))
Vector space quotient V/W of dimension 0 over Rational Field where
V: Vector space of dimension 0 over Rational Field
W: Vector space of degree 0 and dimension 0 over Rational Field
Basis matrix:
[]
>>> sh._cohomology.H(Integer(2)).dimension() == sh.cohomology(Integer(2))
True

The rather complicated form (as a quotient of vector spaces) of the \(r\)-th cohomology group H(r) reflects the internal representation of the cohomology group in terms of the cohomology groups of twisted structure sheaves of a projective space.

On the other hand, it is not clear how to represent \(H^0(\tilde M)\) in terms of twisted structure sheaves of a projective space. Hence it is merely created as a vector space over \(k\) with the correct dimension:

sage: P2.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: X = P2.subscheme([x^4 + y^4 + z^4])
sage: sh = X.structure_sheaf()
sage: sh.cohomology(0)
1
sage: sh._cohomology.H(0)
Vector space of dimension 1 over Rational Field
>>> from sage.all import *
>>> P2 = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P2._first_ngens(3)
>>> X = P2.subscheme([x**Integer(4) + y**Integer(4) + z**Integer(4)])
>>> sh = X.structure_sheaf()
>>> sh.cohomology(Integer(0))
1
>>> sh._cohomology.H(Integer(0))
Vector space of dimension 1 over Rational Field
class sage.schemes.projective.cohomology.CohomologyGroupBottom(S, shifts)[source]

Bases: SageObject

Bottom cohomology group of the twisted structure sheaf of a projective space.

INPUT:

  • S – a direct sum of copies of the coordinate ring of a projective space

  • shifts – shifts of the component rings of S

This represents \(\bigoplus_{j=1}^{t_i}H^0(\OO_{\PP^r}(-m^{(i)}_j))\) for shifts \(m^{(i)}_j\).

EXAMPLES:

sage: P2.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: X = P2.subscheme([x^4 + y^4 + z^4])
sage: c = X.structure_sheaf()._cohomology
sage: c.cohomology_group_bottom(0)
Bottom Cohomology Group of dimension 1
>>> from sage.all import *
>>> P2 = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P2._first_ngens(3)
>>> X = P2.subscheme([x**Integer(4) + y**Integer(4) + z**Integer(4)])
>>> c = X.structure_sheaf()._cohomology
>>> c.cohomology_group_bottom(Integer(0))
Bottom Cohomology Group of dimension 1
class sage.schemes.projective.cohomology.CohomologyGroupTop(S, shifts)[source]

Bases: SageObject

Top cohomology group of the twisted structure sheaf of a projective space.

INPUT:

  • S – a direct sum of copies of the coordinate ring of a projective space

  • shifts – shifts of the component rings of S

This represents \(\bigoplus_{j=1}^{t_i}H^r(\OO_{\PP^r}(-m^{(i)}_j))\) for shifts \(m^{(i)}_j\).

EXAMPLES:

sage: P2.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: X = P2.subscheme([x^4 + y^4 + z^4])
sage: c = X.structure_sheaf()._cohomology
sage: c.cohomology_group_top(0)
Top Cohomology Group of dimension 0
>>> from sage.all import *
>>> P2 = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P2._first_ngens(3)
>>> X = P2.subscheme([x**Integer(4) + y**Integer(4) + z**Integer(4)])
>>> c = X.structure_sheaf()._cohomology
>>> c.cohomology_group_top(Integer(0))
Top Cohomology Group of dimension 0
class sage.schemes.projective.cohomology.MaruyamaMethod(M, twist=0)[source]

Bases: SageObject

This class implements Maruyama’s method to compute the cohomology group \(H^q(\tilde M(n))\) as a vector space over the base field \(k\) and \(h^q(\tilde M(n))=\dim_kH^q(\tilde M(n))\) where \(n\) denotes the twist.

INPUT:

  • M – a quotient of a free module over \(S\) by a submodule, where \(S\) is a multi-variate polynomial ring

  • twist – (default: 0) an integer

This class provides H() and h() as public interface, and all other methods are internal.

EXAMPLES:

sage: P2.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: X = P2.subscheme([x^4 + y^4 + z^4])
sage: sh = X.structure_sheaf(1)  # twisted sheaf
sage: sh._cohomology
Maruyama Method using S(1) <-- S(-3) <-- 0
>>> from sage.all import *
>>> P2 = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P2._first_ngens(3)
>>> X = P2.subscheme([x**Integer(4) + y**Integer(4) + z**Integer(4)])
>>> sh = X.structure_sheaf(Integer(1))  # twisted sheaf
>>> sh._cohomology
Maruyama Method using S(1) <-- S(-3) <-- 0
H(q)[source]

Return the \(q\)-th cohomology group \(H^q(\tilde M)\).

INPUT:

  • q – non-negative integer

EXAMPLES:

sage: P2.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: X = P2.subscheme([x^4 + y^4 + z^4])
sage: c = X.structure_sheaf()._cohomology
sage: c.H(1)
Vector space quotient V/W of dimension 3 over Rational Field where
V: Vector space of degree 3 and dimension 3 over Rational Field
Basis matrix:
[1 0 0]
[0 1 0]
[0 0 1]
W: Vector space of degree 3 and dimension 0 over Rational Field
Basis matrix:
[]
>>> from sage.all import *
>>> P2 = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P2._first_ngens(3)
>>> X = P2.subscheme([x**Integer(4) + y**Integer(4) + z**Integer(4)])
>>> c = X.structure_sheaf()._cohomology
>>> c.H(Integer(1))
Vector space quotient V/W of dimension 3 over Rational Field where
V: Vector space of degree 3 and dimension 3 over Rational Field
Basis matrix:
[1 0 0]
[0 1 0]
[0 0 1]
W: Vector space of degree 3 and dimension 0 over Rational Field
Basis matrix:
[]
cohomology_group_bottom(i)[source]

Return \(i\)-th bottom cohomology group \(\bigoplus_{j=1}^{t_i}H^0(\OO_{\PP^r}(-m^{(i)}_j))\)

EXAMPLES:

sage: P2.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: X = P2.subscheme([x^4 + y^4 + z^4])
sage: c = X.structure_sheaf()._cohomology
sage: c.cohomology_group_bottom(1)
Bottom Cohomology Group of dimension 0
>>> from sage.all import *
>>> P2 = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P2._first_ngens(3)
>>> X = P2.subscheme([x**Integer(4) + y**Integer(4) + z**Integer(4)])
>>> c = X.structure_sheaf()._cohomology
>>> c.cohomology_group_bottom(Integer(1))
Bottom Cohomology Group of dimension 0
cohomology_group_top(i)[source]

Return \(i\)-th top cohomology group \(\bigoplus_{j=1}^{t_i}H^r(\OO_{\PP^r}(-m^{(i)}_j))\)

EXAMPLES:

sage: P2.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: X = P2.subscheme([x^4 + y^4 + z^4])
sage: c = X.structure_sheaf()._cohomology
sage: c.cohomology_group_top(1)
Top Cohomology Group of dimension 3
>>> from sage.all import *
>>> P2 = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P2._first_ngens(3)
>>> X = P2.subscheme([x**Integer(4) + y**Integer(4) + z**Integer(4)])
>>> c = X.structure_sheaf()._cohomology
>>> c.cohomology_group_top(Integer(1))
Top Cohomology Group of dimension 3
differential_bottom(i)[source]

Return the \(i\)-th bottom differential map \(H^0(f_i)\).

EXAMPLES:

sage: P2.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: X = P2.subscheme([x^4 + y^4 + z^4])
sage: c = X.structure_sheaf()._cohomology
sage: c.differential_bottom(1)
Vector space morphism represented as left-multiplication by the matrix:
[]
Domain: Vector space of dimension 0 over Rational Field
Codomain: Vector space of dimension 1 over Rational Field
>>> from sage.all import *
>>> P2 = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P2._first_ngens(3)
>>> X = P2.subscheme([x**Integer(4) + y**Integer(4) + z**Integer(4)])
>>> c = X.structure_sheaf()._cohomology
>>> c.differential_bottom(Integer(1))
Vector space morphism represented as left-multiplication by the matrix:
[]
Domain: Vector space of dimension 0 over Rational Field
Codomain: Vector space of dimension 1 over Rational Field
differential_top(i)[source]

Return the \(i\)-th top differential map \(H^r(f_i)\).

EXAMPLES:

sage: P2.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: X = P2.subscheme([x^4 + y^4 + z^4])
sage: c = X.structure_sheaf()._cohomology
sage: c.differential_top(1)
Vector space morphism represented as left-multiplication by the matrix:
[]
Domain: Vector space of dimension 3 over Rational Field
Codomain: Vector space of dimension 0 over Rational Field
>>> from sage.all import *
>>> P2 = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P2._first_ngens(3)
>>> X = P2.subscheme([x**Integer(4) + y**Integer(4) + z**Integer(4)])
>>> c = X.structure_sheaf()._cohomology
>>> c.differential_top(Integer(1))
Vector space morphism represented as left-multiplication by the matrix:
[]
Domain: Vector space of dimension 3 over Rational Field
Codomain: Vector space of dimension 0 over Rational Field
h(q)[source]

Return the dimension \(h^q(\tilde M)\) of the \(q\)-th cohomology group \(H^q(\tilde M)\).

INPUT:

  • q – non-negative integer

EXAMPLES:

sage: P2.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: X = P2.subscheme([x^4 + y^4 + z^4])
sage: c = X.structure_sheaf()._cohomology
sage: c.h(1)
3
>>> from sage.all import *
>>> P2 = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P2._first_ngens(3)
>>> X = P2.subscheme([x**Integer(4) + y**Integer(4) + z**Integer(4)])
>>> c = X.structure_sheaf()._cohomology
>>> c.h(Integer(1))
3