Divisors

This section contains functionality for working with divisors on varieties (integral schemes defined over a field) of dimension greater than one. Currently, divisors can only be created on projective schemes X and there is also a restriction that X is ordinary projective for many of the less formal intrinsics that rely on the coherent sheaf code. In a number of places it is also required that a divisor D is Cartier (always true if X is non-singular), which can be we explicitly checked in general using the IsCartier intrinsic. There are also a number of intrinsics that are specific to surfaces.

The scheme X may be singular but is assumed to be a normal variety. In the absence of normality, problems may occur at along the non-normal locus L. In particular, any codimension 1 irreducible components of L will function badly as divisor components. Even when L is of codimension ≥2 in X, we may get strange behaviour at points of L. For example, a locally-principal (Cartier) effective divisor passing through a non-normal point p may become non-Cartier at p when its defining ideal I is replaced by the "pure codimension 1" component of I. This replacement is carried out as a matter of course in certain places where we need to kill off higher-codimensional components of the defining ideal of an effective divisor that would affect a computation.

Integral divisors are represented as differences of effective divisors, which are represented as subschemes of the scheme they live on. Factorisation into multiples of irreducibles can also be performed and the result is stored once calculated. It is also possible to work with Q-divisors. These are represented internally as factorisations with rational multiplicity of components.

The package of divisor functions is at and early stage and a number of the intrinsics are not as general as they could be and/or could be made more efficient. However, it is useful functionality that seems worth exporting now. There is much further work still to be done.

Contents

Divisor Groups

As for curves, there is a divisor group object associated to a variety X, which is the parent of all divisors on X. It is of type DivSch.

DivisorGroup(X) : Sch -> DivSch
The divisor group of variety X.
Variety(G) : DivSch -> Sch
The variety of the divisor group G.
G1 eq G2: DivSch, DivSch -> BoolElt
Returns true if and only if the divisor groups G1 and G2 are for the same variety.

Creation Of Divisors

Divisors are of type DivSchElt. Internally, an integral, effective divisor D on variety X is stored as an ideal which defines D as a subscheme of X. A general divisor is represented internally in partially factored form as a list of pairs of ideals and rational multiplicities [< Ii, mi >] which represents the Q-rational (integral, if all mi are integers) divisor ∑i mi * D(Ii), where D(Ii) is the effective divisor on X defined by the ideal Ii. An integral, effective divisor may also have a factorisation stored. The internal factorisation can change over time with the Ii being decomposed into products of larger ideals. When the Ii are all prime ideals, we say that the factorisation is a prime factorisation of D.

This section contains the basic creation functions for divisors.

Divisor(X,f) : Sch, FldFunFracSchElt -> DivSchElt
Divisor(X,f) : Sch, FldFunRatMElt -> DivSchElt
Divisor(X,f) : Sch, RngMPolElt -> DivSchElt
These create the integral divisor on X defined by a single global element f. In the first two cases, f is an element of the function field (or the field of fractions of the coordinate ring of) the projective ambient of X. The divisor is non-effective (unless it is zero): the divisor of zeroes of f minus its divisor of poles. In the last case f should be a homogeneous polynomial in the coordinate ring of the ambient and the divisor is the effective divisor defined by the subscheme of X whose ideal is generated by the ideal of X and f.
Divisor(X,Q) : Sch, SeqEnum -> DivSchElt
Divisor(X,Y) : Sch, Sch -> DivSchElt
Divisor(X,I) : Sch, RngMPol -> DivSchElt
    CheckSaturated: BoolElt             Default: false
    CheckDimension: BoolElt             Default: false
    UseCodimensionOnePart: BoolElt      Default: false
These three intrinsics define an integral, effective divisor on projective variety X defined by an ideal or subscheme. For the first, Q is a sequence of elements in the coordinate ring of X and it is equivalent to passing the ideal generated by the ideal of X and Q. For the second, Y is a subscheme of X that should define an effective divisor on X. For the third, I is an ideal in the coordinate ring of the ambient of X, whose saturation J should contain the ideal of X. The effective divisor is given by the closed subscheme of X whose ideal is J.

The parameter CheckSaturated can be set to true in the third case if it is known that I is already saturated or in the second case if it is known that the ideal of Y is already saturated. The parameter CheckDimension can be set to true in any of the cases if it is known that the subscheme defining the divisor is of pure codimension 1 in X. Otherwise this condition is checked with the following exception. In the third case, if parameter UseCodimensionOnePart is set to true the non-codimension 1 part of the ideal is ignored in creating the divisor.

HyperplaneSectionDivisor(X) : Sch -> DivSchElt
Creates a divisor given by a hyperplane section of projective variety X.
ZeroDivisor(X) : Sch -> DivSchElt
The zero divisor on variety X.
CanonicalDivisor(X) : Sch -> DivSchElt
A canonical divisor on variety X which must be ordinary projective and should be a Gorenstein scheme for this to give a correct result. It uses the canonical sheaf on X and the next intrinsic.
SheafToDivisor(S) : ShfCoh -> DivSchElt
The argument S is a coherent sheaf that should be invertible (locally free, rank 1) on a variety X. Then S is isomorphic to L(D) for a (Cartier) divisor D (defined up to rational equivalence) on X. Returns such a divisor D which is effective if possible.
RoundDownDivisor(D) : DivSchElt -> DivSchElt
For an integral divisor D just returns D. For a non-integral (Q-rational) divisor with a factorisation into sum of rational multiples of prime components, returns the divisor of the integer multiple sum of primes given by rounding down all of the original rational coefficients.
RoundUpDivisor(D) : DivSchElt -> DivSchElt
For an integral divisor D just returns D. For a non-integral (Q-rational) divisor with a factorisation into sum of rational multiples of prime components, returns the divisor of the integer multiple sum of primes given by rounding up all of the original rational coefficients.
FractionalPart(D) : DivSchElt -> DivSchElt
Returns D - RoundDownDivisor(D).
IntegralMultiple(D) : DivSchElt -> DivSchElt,RngIntElt
Finds a positive integer N such that E=N * D is an integral divisor. Returns E and N. This does not attempt to find the smallest possible N by analysing the full prime factorisation of D.
EffectiveHypersurfaceTwist(D) : DivSchElt -> DivSchElt, RngMPolElt
The divisor D should be an integral divisor on an ordinary projective variety X. Let H denotes a hyperplane divisor of X. Returns an effective divisor D1 linearly equivalent to D + rH for some r ≥0. In fact, it also returns a non-zero homogeneous polynomial F of degree r in the coordinate ring of the ambient of X such that D1 = D + (F) where (F) ~rH is the divisor of vanishing of F on X. The D1 returned will have an effective ideal factorisation (i.e., all multiplicities mi in the stored factorisation will be positive integers). If D already has an effective ideal factorisation, D itself is returned with F=1.

Ideals and Factorisations

Divisors are stored in ideal or factored form as described in the introduction to the last section. This section contains functions related to these representing structures.

Ideal(D) : DivSchElt -> RngMPol
Returns the defining ideal for an effective, integral divisor D.
Support(D) : DivSchElt -> Sch
The subscheme of the variety of effective Q-divisor D that gives its support.
IdealOfSupport(D) : DivSchElt -> RngMPol
The ideal in the coordinate ring of the ambient of the variety of the effective Q-divisor D that defines it's support.
SignDecomposition(D) : DivSchElt -> DivSchElt, DivSchElt
The decomposition of D into two effective divisors A and B such that D=A - B. A and B are returned. Note that they are not guaranteed to be relatively prime for this intrinsic.
IdealFactorisation(D) : DivSchElt -> SeqEnum
Returns the current stored factorisation of D as a sequence of pairs of ideals and rational multiplicities.
CombineIdealFactorisation(~D) : DivSchElt ->
Simplify the current ideal factorisation of D by combining terms with the same ideal.
ComputeReducedFactorisation(~D) : DivSchElt ->
ReducedFactorisation(D) : DivSchElt -> SeqEnum
Replace the ideal factorisation of D with an equivalent reduced factorisation where all ideals occurring are primary. The first intrinsic just does the replacement internally. The second intrinsic also returns the result.
ComputePrimeFactorisation(~D) : DivSchElt ->
PrimeFactorisation(D) : DivSchElt -> SeqEnum
Replace the ideal factorisation of D with an equivalent prime factorisation where all ideals occurring are prime. The first intrinsic just does the replacement internally. The second intrinsic also returns the result.
Multiplicity(D,E) : DivSchElt, DivSchElt -> FldRatElt
The multiplicity of prime divisor E in divisor D. The ideal factorisation of D is replaced by a factor representing E to the multiplicity along with factors which are the original ideal factors of D with the maximum powers of E divided out. This refactorisation comes from the computation which iteratively calculates the colon ideal by E of the original factors.
MultiplicityFast(D,E) : DivSchElt, DivSchElt -> FldRatElt
This is a fast version of Multiplicity that can be applied when the variety X of D and E is affine or ordinary projective and E is known to be Cartier. It is usually faster than the general version, not having to compute colon ideals, but has the drawback of not refactorising the ideal factorisation of D into a power of E and remainders. As a fast version, it also does not check that E is prime whereas the usual multiplicity intrinsic does.
Multiplicities(D,P) : DivSchElt, SeqEnum[DivSchElt] -> SeqEnum
This is a fast (usually) variant of Multiplicity for working with divisors that are all supported on a known set of prime divisors. The argument D is a divisor on variety X and P should be a sequence of prime divisors containing all of the primes that D is supported on. Returns the sequence of multiplicities of p in D for p∈P. X must be ordinary projective here.

The method used to is reduce to the dimension 1 case for X by cutting with random hyperplanes and then use magma's divisor and place functionality for curves to compute the result. We have to be careful in choosing hyperplanes such that at each stage of reducing the dimension by 1: the cut X is purely of dimension one less than before; all of the cut divisors p are purely of dimension one less than before and have no component lying in the singular locus of cut X; no components of a pair of cut p coincide.

The reason for requiring that all prime factors in the support of D lie in P is that other factors of D outside of P could end up coinciding with a factor p in P on repeated cutting by hyperplanes. This would lead to a multiplicity for p that is too large. This actually occurs in the example below.

This intrinsic is particularly useful when X lies in a fairly small dimensional ambient and the user is interested in computing multiplicities of a number of divisors that are supported on a fixed set of prime divisors and can have quite high multiplicities with respect to these.

Example Scheme_sch-div-mults (H119E75)

We take a (singular but normal) degree 3 Del Pezzo surface S in (P)3 and 3 lines on it that form a hyperplane section H as our initial set of P. We let D be the hypersurface divisor with equation the cube of the equation of H multiplied by the square of a different linear form that vanishes on the third line but not the other two. The expected multiplicities are thus [3, 3, 5]. However, not including the second prime divisor of the second linear form leads to the wrong result! The chosen cutting merges the ignored prime divisor of the support with the third line and leads to a value for the third multiplicity that is too high. When we include the final divisor of the support of D in our set P, we get the correct result.
> P<x,y,z,t> := ProjectiveSpace(Rationals(),3);
> F := x^3+y^3+z^3+3*y^2*t+3*y*z*t+3*z^2*t+3*y*t^2+3*z*t^2+t^3;
> S := Surface(P,F);
> R := CoordinateRing(P);
> Ils := [ideal<R|[u,x+y+z+t-u]> : u in [x,y,z]]; //ideals of the three lines
> P := [Divisor(S,I) : I in Ils];
> g1 := x+y+z+t; // hyperplane = the sum of the lines
> g2 := x+y+t;   // hyperplane through only the 3rd line
> D := Divisor(S,g1^3*g2^2);
> Multiplicities(D,P);
[3,3,9]
> // wrong! we need to include the extra prime divisor of the support.
> D1 := Divisor(S,g2);
> PrimeFactorisation(D1);
[
    <Ideal of Polynomial ring of rank 4 over Rational Field
    Order: Graded Reverse Lexicographical
    Variables: x, y, z, t
    Homogeneous, Dimension 2, Radical, Prime
    Groebner basis:
    [
        z^2 + 3*y*t + 3*z*t + 3*t^2,
        x + y + t
    ], 1>,
    <Ideal of Polynomial ring of rank 4 over Rational Field
    Order: Graded Reverse Lexicographical
    Variables: x, y, z, t
    Homogeneous, Dimension 2, Radical, Prime
    Groebner basis:
    [
        x + y + t,
        z
    ], 1>
]
> P4 := Divisor(S,$1[1][1]);
> Multiplicities(D,P cat [P4]); //this gives the correct result!
[ 3, 3, 5, 2 ]

Basic Divisor Predicates

IsZeroDivisor(D) : DivSchElt -> BoolElt
Returns whether D is the zero divisor.
IsIntegral(D) : DivSchElt -> BoolElt
Returns whether D is an integral divisor. If this isn't immediately obvious from the current factorisation, will convert to a prime factorisation and try to combine terms.
IsEffective(D) : DivSchElt -> BoolElt
Returns whether D is an effective divisor. If this isn't immediately obvious from the current factorisation, will convert to a prime factorisation and try to combine terms.
IsPrime(D) : DivSchElt -> BoolElt
Returns whether D is a prime divisor.
IsFactorisationPrime(D) : DivSchElt -> BoolElt
Returns whether the current factorisation of D is a prime factorisation (i.e. all ideals occurring are prime).
IsDivisible(D) : DivSchElt -> BoolElt, RngIntElt
Returns whether D is integral and divisible as an integral divisor by an integer n > 1. If so, also returns the maximum such n.

Arithmetic of Divisors

D1 + D2 : DivSchElt, DivSchElt -> DivSchElt
D1 + D2 : DivSchElt, DivTorElt -> DivSchElt
D1 + D2 : DivTorElt, DivTorElt -> DivSchElt
D1 - D2 : DivSchElt, DivSchElt -> DivSchElt
D1 - D2 : DivSchElt, DivTorElt -> DivSchElt
D1 - D2 : DivTorElt, DivSchElt -> DivSchElt
- D : DivSchElt -> DivSchElt
Addition, subtraction and unitary minus on divisors. For addition and subtraction, one argument may be a toric divisor whose toric variety is the variety of the scheme divisor.
n * D : RngIntElt, DivSchElt -> DivSchElt
r * D : FldRatElt, DivSchElt -> DivSchElt
Multiplication of a divisor D by an integer n or rational number r. Note that the multiplication by r is the only current primitive method for constructing non-integral divisors.
D1 eq D2 : DivSchElt, DivSchElt -> BoolElt
Returns whether divisors D1 and D2 lie on the same variety and are equal.

Further Divisor Properties

More complicated predicates on divisors.

IsCanonical(D) : DivSchElt -> BoolElt
Returns whether D is a canonical divisor by testing whether its associated sheaf is isomorphic to the canonical sheaf. The variety of D must be ordinary projective here and should be Gorenstein.
IsAnticanonical(D) : DivSchElt -> BoolElt
Returns whether D is an anticanonical divisor by testing whether its associated sheaf is isomorphic to the dual of the canonical sheaf. The variety of D must be ordinary projective here and should be Gorenstein.
IsCanonicalWithTwist(D) : DivSchElt -> BoolElt, RngIntElt
Returns whether D is the sum of a hypersurface divisor of degree d and a canonical divisor by testing whether its associated sheaf is isomorphic to a twist of the canonical sheaf. If so, also returns d. The variety of D must be ordinary projective here and should be Gorenstein.
IsPrincipal(D) : DivSchElt -> BoolElt, FldFunFracSchElt
Returns whether D with variety X is a principal divisor and, if so, also returns an element f of the function field of the ambient of X such that D = div(f). X should be ordinary projective and D a Cartier divisor here. Uses the Riemann-Roch space of D.
IsCartier(D) : DivSchElt -> BoolElt
Returns whether D is a Cartier divisor on its variety X. This is equivalent to D being locally-principal. That is, X can be covered by Zariski-open subsets Ui such that the restriction of D to each Ui is equal to the restriction of div(fi) to Ui for some fi. X must be ordinary projective here.

Example Scheme_divs-cartier-ex (H119E76)

Many divisors are automatically Cartier. If X is non-singular, all divisors are. If X is ordinary projective, the easiest divisors to construct are the hypersurface divisors defined by a homogeneous form that doesn't vanish on all of X. These are also all Cartier whether X is singular or not.

On the other hand, on an anticanonically-embedded degenerate Del Pezzo surface, a line that passes through a singular point is usually not Cartier. We give an example of a degenerate degree 4 Del Pezzo with 2 A1 singularities where we verify this for a particular line using IsCartier.

> P<x,y,z,t,u> := ProjectiveSpace(RationalField(), 4);
> S := Surface(P,[z^2-z*t-y*u, y*z-x*t-z*t-y*u]);
> p := S![0,0,0,0,1];
> IsSingular(p);
true (0 : 0 : 0 : 0 : 1)
> l := Scheme(P,[y,z-t,x+z]); // l is a line thorugh p
> l subset S; // and l lies in S
true
> D := Divisor(S,Ideal(l));
> IsCartier(D);
false
IsLinearlyEquivalent(D,E) : DivSchElt, DivSchElt -> BoolElt, FldFunFracSchElt
Returns whether two divisors D and E on variety X are linearly equivalent and, if so, also returns an element f of the function field of the ambient of X such that D = E + (div)(f). Uses IsPrincipal for the difference between the two divisors, so X must be ordinary projective.
BaseLocus(D) : DivSchElt -> Sch
IsBasePointFree(D) : DivSchElt -> BoolElt
IsMobile(D) : DivSchElt -> BoolElt
The first intrinsic computes the base locus of the linear system |[D]| (i.e. the reduced intersection of all effective divisors in the linear system) where [D] is the round down of D . This uses the Riemann-Roch space of [D], which means that this divisor has to be Cartier and the variety X of D has to be ordinary projective.

The second intrinsic returns whether this base locus is empty and the third whether it is of codimension at least two in X (i.e. there are no common divisor components to the full linear system). X and D obviously have to satisfy the same conditions.

IntersectionNumber(D1,D2) : DivSchElt, DivSchElt-> FldRatElt
The arguments D1 and D2 are divisors on a variety X which must be of dimension 2. One of the two divisors is assumed to be Cartier. Computes the intersection pairing number D1.D2.
SelfIntersection(D) : DivSchElt -> FldRatElt
The intersection number of D with itself where the divisor D on X must satisfy the conditions for the last intrinsic.
Degree(D) : DivSchElt -> FldRatElt
Degree(D,H) : DivSchElt, DivSchElt-> FldRatElt
The argument D (resp. D and H) lies on a variety X of dimension 2. The first computes the intersection number of D with respect to a hyperplane divisor. The second computes the intersection number of D with H (so is just equivalent to IntersectionNumber(D,H)).
IsNef(D) : DivSchElt -> BoolElt
The argument D should be a Q-Cartier divisor on a projective surface X. Currently, it also has to be effective. Returns whether D is a nef divisor: i.e. whether it has non-negative intersection with all effective divisors on X.
IsNefAndBig(D) : DivSchElt -> BoolElt
The divisor D on X is as above. The divisor D must be effective. Returns whether D is a nef divisor and has positive self-intersection.
NegativePrimeDivisors(D) : DivSchElt -> SeqEnum
The divisor D on X again should satisfy the same conditions as in IsNef. Returns a sequence of prime divisor components of D which have negative intersection with D.
ZariskiDecomposition(D) : DivSchElt -> DivSchElt, DivSchElt
The divisor D on X again should satisfy the same conditions as in IsNef. Returns a pair of Q-divisors P and N such that D=P + N, P is nef and N has negative-definite support (i.e. the intersection pairing on its prime components is negative definite).
Reduction(D,p) : DivSchElt, Any -> DivSchElt
    parent: Sch                         Default: false
The variety X of the divisor D should be an ordinary projective scheme defined over K, the rational field or a number field. If K is the rationals then argument p should be a rational prime and if K is a number field, p should be a place or a prime ideal in an order of K.

Computes and returns Dp, the reduction mod p of D, which is a divisor on Xp, the reduction of the flat closure of X as defined by the intrinsic (Reduction). Note that it is not checked whether Xp is normal or even a variety over kp (the residue class field of p). The reduction is carried out on the components in the current ideal factorisation of D in the same way the reduction of X itself is computed.

If the reduction of X has already been computed as Y, say, and the user wishes the result Dp to be a divisor on Y, this can be achieved by setting the parameter parent equal to Y.

Riemann-Roch Spaces

This section contains functions to compute and work with Riemann-Roch spaces for a divisor D. It is always assumed that X, the variety of D, is an ordinary projective space here. The Riemann-Roch space is the finite-dimensional subspace of the vector space (over the basefield) of rational functions on X consisting of zero and all f ≠0 such that D + div(f) is an effective divisor. Thus, the Riemann-Roch space of D is the same as the Riemann-Roch space of [D], RoundDownDivisor(D). Because the sheaf code is used (or a slight variant for non-effective divisors), it is also required that [D] is Cartier for all relevant intrinsics.

Sheaf(D) : DivSchElt -> ShfCoh
The invertible sheaf corresponding to the divisor class of divisor D. If D is not integral, its round down [D] is used. This divisor must be Cartier and its variety X must be ordinary projective. Is effectively the same function as in the Sheaf package when D is effective and uses a slight variant otherwise.
RiemannRochBasis(D) : DivSchElt -> SeqEnum
RiemannRochSpace(D) : DivSchElt -> ModTupFld, Map
The first returns a basis of the Riemann-Roch space of the round down [D] of divisor D (as a sequence of elements in the function field F of the ambient of D's variety, X). The second returns the Riemann-Roch space as an abstract vector space V over the base field along with a map from V to F. The variety X must be ordinary projective and [D] Cartier. If D is effective, this is the same as using the coherent sheaf function that computes the associated invertible sheaf and Riemann-Roch basis. If D is non-effective a slight variant is used.
RiemannRochCoordinates(f,D) : Any, DivSchElt -> BoolElt, SeqEnum
Returns whether f can be coerced into the function field of the ambient of D's variety X and whether f then lies in the Riemann-Roch space of D. If so also returns the coordinates of f with respect to the basis of the Riemann-Roch space returned by RiemannRochBasis(D). As usual, X must be ordinary projective and [D], the round down of D, must be Cartier.
IsLinearSystemNonEmpty(D) : DivSchElt -> BoolElt, DivSchElt
Returns whether there is an effective divisor linearly equivalent to D and, if so, returns such a divisor. Uses the Riemann-Roch space of D. The conditions on D and X, its variety, are as for the preceding intrinsics.
V2.28, 13 July 2023