Invariant Divisors and Riemann-Roch Spaces

Divisors on toric varieties work in the same way as on any other varieties, except that within each linear equivalence class it is possible to choose torus invariant representatives. These invariant divisors are composed of toric strata, and so in raw combinatorial terms one can regard divisors as being integer (or rational) labels on the rays of the fan. This is a convenient way to construct divisors, but there are many other methods.

As for other schemes on which divisor calculations are defined in Magma, divisors on a toric variety have a single divisor group as their parent. Divisors can be constructed by coercing appropriate data into this group, but this is not the only method so it can be ignored for most purposes. (This group is, however, the connection between divisors and the toric variety, so it is always alive in the background.)

Contents

Divisor Group

DivisorGroup(X) : TorVar -> DivTor
The divisor group of the toric variety X. This is simply a parent object for divisors on X, and it is not computed as an abstract group.
ToricVariety(G) : DivTor -> TorVar
The toric variety of which G is the divisor group.
G1 eq G2 : DivTor,DivTor -> BoolElt
Return true if and only if the divisor groups G1 and G2 are those of the same toric variety.
Divisor(G,S) : DivTor,[RngIntElt] -> DivTorElt
Divisor(G,S) : DivTor,[FldRatElt] -> DivTorElt
The divisor on the toric variety X associated to the divisor group G with coefficients given by the sequence S of integers or rationals with respect to the rays of the fan of X.
Divisor(G,i) : DivTor,RngIntElt -> DivTorElt
The divisor on the toric variety X associated to the divisor group G given by the vanishing of the ith coordinate of X.

Constructing Invariant Divisors

D1 + D2 : DivTorElt,DivTorElt -> DivTorElt
n * D : FldRatElt,DivTorElt -> DivTorElt
- D : DivTorElt -> DivTorElt
D1 - D2 : DivTorElt,DivTorElt -> DivTorElt
D * v : DivTorElt,TorLatElt -> RngIntElt

Standard arithmetic operations for divisors D, D1, D2 on a toric variety, where n∈Q and v is a point of the ambient toric lattice of the corresponding fan.

Divisor(X,S) : TorVar,[RngIntElt] -> DivTorElt
The Weil divisor (respectively Q-Weil divisor) on the toric variety X whose multiplicity on the ith coordinate divisor is the ith element of the sequence S of integers (respectively, rational numbers).
Divisor(X,i) : TorVar,RngIntElt -> DivTorElt
The divisor on the toric variety X given by the vanishing of the ith coordinate of X.
Divisor(X,f) : TorVar,RngMPolElt -> DivTorElt
The divisor on the toric variety X defined by the polynomial f of the Cox ring of X.
Divisor(X,m) : TorVar,TorLatElt -> DivTorElt
If m is in the monomial lattice of the toric variety X, this gives the principal divisor on X corresponding to the monomial m. If m is a form on the ray lattice of X, then this gives the Weil divisor corresponding to m.
ZeroDivisor(X) : TorVar -> DivTorElt
The zero divisor on the toric variety X.
Representative(X,m) : TorVar,ModEDElt -> DivTorElt
    effective: BoolElt                  Default: true
A divisor D on the toric variety X whose class modulo linear equivalence equals m, an element of the divisor class group of X. Unless the parameter effective is set to false, D will be chosen to be effective if possible.
Representative(X,m) : TorVar,TorLatElt -> DivTorElt
    effective: BoolElt                  Default: true
A divisor D on the toric variety X whose class modulo linear equivalence equals m, an element of the Picard lattice or divisor class lattice of X. Unless the parameter effective is set to false, D will be chosen to be effective if possible.
CanonicalDivisor(X) : TorVar -> DivTorElt

The canonical divisor of the toric variety X.

CanonicalClass(X) : TorVar -> DivTorElt
    group: MonStgElt                    Default: "Pic"
The class of canonical divisor of the toric variety X. By default this is returned as an element of the Picard lattice of X (and X must be Q-Gorenstein for this to make sense). However, the parameter group can be changed to Cl to return the divisor in the divisor class lattice or ClZ to return the divisor in the divisor class group.

Example Toric_toric-kawamata-blowup-example (H126E15)

We compute the Kawamata blowup of 1/7(1, 2, 5). First we construct the singular cone by hand:
> L := ToricLattice(3);
> C := PositiveQuadrant(L);
> v := L![1/7,2/7,5/7];
> LL,phi := AddVectorToLattice(v);
> CC := Cone(phi(Rays(C)));
> CC;
3-dimensional simplicial cone CC with 3 minimal generators:
    (1, 0, 0),
    (0, 1, 0),
    (4, 1, 7)
Now we compute the blowup.
> FF := Fan(CC);
> vv := phi(v);
> vv;
(3, 1, 5)
> GG := Blowup(Fan(CC),vv);
The blowup map is easy to recover:
> X := ToricVariety(Rationals(),FF);
> Y<x,y,z,t> := ToricVariety(Rationals(),GG);
> f := ToricVarietyMap(Y,X);
> f;
A map between toric varieties described by:
    (t)^(2/7)*(x),
    (t)^(1/7)*(y),
    (t)^(5/7)*(z)
Finally we shall compute the discrepancy of this Kawamata blowup. It should be 1/7.
> KX := CanonicalDivisor(X);
> KY := CanonicalDivisor(Y);
> KY - Pullback(f,KX);
Q-Weil divisor with coefficients:
    0, 0, 0, 1/7

Properties of Divisors

Variety(D) : DivTorElt -> TorVar
The toric variety on which the divisor D is defined.
Parent(D) : DivTorElt -> DivTor
The divisor group of a toric variety in which the divisor D lies.
Weil(D) : DivTorElt -> SeqEnum
The multiplicities on rays of the fan of X that determine the invariant divisor D, where X is the toric variety on which D is defined.
Cartier(D) : DivTorElt -> SeqEnum[TorLatElt]
The sequence of toric lattice elements (of the monomial lattice of X) that determine the divisor D on the toric affine patches of the toric variety X on which D lies. This requires that D be Q-Cartier.
IsQCartier(D) : DivTorElt -> BoolElt
Return true if and only if some integer multiple of the divisor D on a toric variety is Cartier.
IsCartier(D) : DivTorElt -> BoolElt
Return true if and only if the divisor D on a toric variety is Cartier.
IsWeil(D) : DivTorElt -> BoolElt
Return true if and only if the divisor D on a toric variety is a Weil divisor (that is, its coefficients are integers rather than rational numbers).
IsAmple(D) : DivTorElt -> BoolElt
Returns true if and only if the divisor D on a toric variety is ample.
IsNef(D) : DivTorElt -> BoolElt
Return true if and only if the divisor D on a toric variety is nef.
IsBig(D) : DivTorElt -> BoolElt
Return true if and only if the divisor D on a toric variety is big.
IsEffective(D) : DivTorElt -> BoolElt
Return true if and only if the divisor D on a toric variety is effective.
PicardClass(D) : DivTorElt -> TorLatElt

The class in the Picard lattice corresponding to the Q-Cartier divisor D.

MovablePart(D) : DivTorElt -> DivTorElt
The movable part (or mobile part) of the divisor D on a toric variety.

Example Toric_toric-movable-example (H126E16)

We compute a variety as a blowup of the projective plane.
> X := ProjectiveSpace(Rationals(),[1,1,1]);
> Y<u,v,x,y> := Blowup(X, &+Rays(Fan(X))[1..2]);
> Y;
Toric variety of dimension 2
Variables: u, v, x, y
The components of the irrelevant ideal are:
    (y, x), (v, u)
The 2 gradings are:
    0, 0, 1, 1,
    1, 1, 1, 0
We consider a (toric coordinate) divisor on Y.
> D := Divisor(Y,4);
> MovablePart(D);
Weil divisor with coefficients:
    0, 0, 0, 0
> MovablePart(D) eq ZeroDivisor(Y);
true
The movable part of this divisor is the zero divisor. Adding a little bit of another effective divisor doesn't yet make a mobile divisor, but it has made it stably mobile: some multiple now has a movable part.
> E := D + (1/2)*Divisor(Y,u);
> MovablePart(E);
Weil divisor with coefficients:
    0, 0, 0, 0
>   MovablePart(2*E);
Weil divisor with coefficients:
    1, 0, 0, 1
>   MovablePart(2*E) eq (D + Divisor(Y,u));
true
ImageFan(D) : DivTorElt -> TorFan
The dual fan to the rational polyhedron of sections of the divisor D on a toric variety X. If X is a complete variety, this will give the fan of Proj of the ring of sections of positive powers of D.
Proj(D) : DivTorElt -> TorVar, PlcEnum
Proj (as a toric variety) of the ring of sections of the divisor D on a toric variety. The map of underlying lattices which determines the map Variety(D) -> Proj(D) is also returned.
RelativeProj(D) : DivTorElt -> TorVar
The relative (sheaf) Proj of sections of the divisor D on a toric variety. If D is Q-Cartier, then the identity will be constructed; for non Q-Cartier divisors, a partial Q-factorialisation will be given.
IntersectionForm(X,C) : TorVar,TorCon -> TorLatElt
If the cone C is a codimension 1 face of the fan of the toric variety X, return the dual toric lattice vector that represents intersection of the toric subvariety corresponding to C.
IntersectionForms(X) : TorVar -> [TorLatElt]
The sequence of forms on the Picard lattice of the toric variety X which define the intersection forms with all torus invariant curves.
CartierToWeilMap(X) : TorVar -> Map
The embedding map from the lattice of torus-invariant Cartier divisors to the lattice of torus-invariant Weil divisors of the toric variety X.
PicardToClassGroupsMap(X) : TorVar -> Map
The embedding of the Picard group of X into the divisor class group.
PicardToClassLatticesMap(X) : TorVar -> Map
The natural embedding of the Picard lattice of X into divisor class lattice.

Linear Equivalence of Divisors

IsQPrincipal(D) : DivTorElt -> BoolElt
Return true if and only if some integer multiple of the divisor D on a toric variety is principal.
IsPrincipal(D) : DivTorElt -> BoolElt
Return true if and only if the divisor D on a toric variety is principal.
IsLinearlyEquivalentToCartier(D) : DivTorElt -> BoolElt, DivTorElt
Return true if and only if the divisor D on a toric variety is linearly equivalent to a Cartier divisor; if so, then a representative Cartier divisor is also returned.
AreLinearlyEquivalent(D,E) : DivTorElt,DivTorElt -> BoolElt
IsLinearlyEquivalent(D,E) : DivTorElt,DivTorElt -> BoolElt
Return true if and only if the divisors D and E are linearly equivalent.
LinearlyEquivalentDivisorWithNoSupportOn(D,S) : DivTorElt,[RngMPolElt] -> DivTorElt
A divisor linearly equivalent to the divisor D, with no support on the locus defined by S. S should be a sequence of variables on the variety of D. If S has more than just variables, the other polynomials will be ignored.
DefiningMonomial(D) : DivTorElt -> RngMPolElt
The monomial (if D is effective) or rational monomial defining the divisor D on a toric variety.
LatticeElementToMonomial(D,v) : DivTorElt,TorLatElt -> RngMPolElt
The monomial in the Cox ring that corresponds to the monomial lattice element v when regarded as a section of the divisor D.

Riemann--Roch Spaces of Invariant Divisors

RiemannRochPolytope(D) : DivTorElt -> TorPol
The Riemann--Roch space of the divisor D as a polytope in the monomial lattice of the underlying toric variety.
RiemannRochBasis(D) : DivTorElt -> [RngElt]
A basis of the Riemann--Roch space of the divisor D on a toric variety X: this is a sequence of rational functions on X.
RiemannRochDimension(D) : DivTorElt -> RngIntElt
The dimension of the Riemann--Roch space of the divisor D on a toric variety.
GradedCone(D) : DivTorElt -> TorCon
The graded cone of sections of multiples of the divisor D on a toric variety. In other words, the integral points of the ith graded piece of this cone represent sections of the divisor i * D.
Polyhedron(D) : DivTorElt -> TorPol
The integral polyhedron whose integral points corresponds to sections of the divisor D.

Example Toric_toric-rr-example (H126E17)

We make a simple toric variety Y by blowing up the plane.
> X := ProjectiveSpace(Rationals(),[1,1,1]);
> Y<u,v,x,y> := Blowup(X, &+Rays(Fan(X))[1..2]);
> Y;
Toric variety of dimension 2
Variables: u, v, x, y
The components of the irrelevant ideal are:
    (y, x), (v, u)
The 2 gradings are:
    0, 0, 1, 1,
    1, 1, 1, 0
We make a non-effective divisor as a difference of fibres of the natural map from Y to the line.
> D := 2*Divisor(Y,u) - Divisor(Y,v);
> IsEffective(D);
false
> P := Polyhedron(D);
> monos := [ LatticeElementToMonomial(D,v) : v in Points(P) ];
> monos;
[
    u,
    v
]
The polyhedron P is not quite the Riemann--Roch space of D, but it is for a divisor linearly equivalent to D.
> [ AreLinearlyEquivalent(Divisor(Y,m),D) : m in monos ];
[ true, true ]
HilbertSeries(D) : DivTor -> FldFunRatUElt
The Hilbert series of the divisor D on a toric variety X, namely

Σm≥0 dim H0(X, mD).

This assumes that the spaces of sections H0(X, D) of D finite dimensional. This will be true if X is projective, for example, but it holds in other cases too.

HilbertPolynomial(D) : DivTor -> [RngUPolElt]
The Hilbert (quasi-)polynomial for the divisor D. The space of sections of D must be finite dimensional. That is, a sequence of polynomials [p0, ..., pr - 1] of length r, the quasi-period of the Hilbert polynomial, so that dim H0(X, mD) is the value of ps(k) where m=kr + s is the Euclidean division of m by r; in other words, s is the least residue of m modulo r. Note that since Magma indexes sequences from 1, we have that pi = HilbertPolynomial(D)[i+1].
HilbertCoefficients(D,l) : DivTor,RngIntElt -> [RngIntElt]
The first l + 1 coefficients of the Hilbert series of the divisor D on a toric variety (starting with 0D up to and including lD).
HilbertCoefficient(D,i) : DivTor,RngIntElt -> RngIntElt
Thefirst ith coefficient of the Hilbert series of the divisor D on a toric variety.
HilbertDeltaVector(D) : DivTor -> [RngIntElt]
The Hilbert δ-vector (or h * -vector) for the divisor D on a toric variety.

Example Toric_toric-rr-by-hand (H126E18)

One can recreate the Cech cohomology calculation of the Riemann--Roch space of a divisor D on a toric variety X:

H0(X, (O)X(D)) = ∩σ (mσ + check(σ))

where the sum is taken over top-dimensional cones σ in the fan of X, and mσ is the monomial in the dual lattice which determines D on the affine patch Xσ; check(σ) is the cone dual to σ.

> X<x,y,z> := ProjectiveSpace(Rationals(),[1,3,5]);
> D := Divisor(X,[2,3,1]);
> cones := Cones(Fan(X));
> RRD := &meet [ Polytope([Cartier(D)[i]]) + Dual(cones[i]) : i in [1..3]];
> IsPolytope(RRD);
true
We could compute the number of points of this cone RRD by saying #Points(RRD). This should be regarded as a slow method to determine the number of points---after all, it requires us to find all the points before counting them. There is a specialised point-counting intrinsic NumberOfPoints which does not find the points first. The latter should be used for point counting, although in relatively small examples the former can be a little faster.
> NumberOfPoints(RRD);
14
To compute also the number of points of integral dilations of this polytope, we revert to using the divisor and computing its Hilbert series (or a few coefficients if that's all we need).
> time HilbertCoefficients(D,10);
[ 1, 14, 44, 92, 156, 238, 337, 452, 585, 735, 902 ]
> h<t> := HilbertSeries(D);
> h;
(-4*t^8 - 21*t^7 - 38*t^6 - 51*t^5 - 51*t^4 - 47*t^3 - 30*t^2 - 13*t - 1)/(t^9 -
    t^8 - t^6 + t^5 - t^4 + t^3 + t - 1)
> h * (1 - t) * (1 - t^3) * (1 - t^5);
4*t^8 + 21*t^7 + 38*t^6 + 51*t^5 + 51*t^4 + 47*t^3 + 30*t^2 + 13*t + 1
V2.28, 13 July 2023