# Divisors

In order to consider divisors on curves, we restrict our attention to smooth and irreducible curves.

Let $C$ be an affine or projective plane curve defined by an irreducible equation $F$. Then any polynomial function $G$ which is not divisible by $F$ will vanish on $C$ only at finitely many points. A way to encode these points together with their intersection multiplicities is to consider a divisor. A divisor on a curve is a formal finite sum of points of the curve with integer coefficients. A natural operation of addition can be defined on the set of divisors of a curve, which turns it into an Abelian group.

## Constructors

Divisors on curves are here introduced as a dictionary associating a point on the curve to its multiplicity.

AffineCurveDivisorType
AffineCurveDivisor(C::AffinePlaneCurve{S}, D::Dict{Point{S}, Int}) where S <: FieldElem

Given a curve C which is assumed to be smooth and irreducible, return the divisor on the curve C defined by D.

Examples

julia> R, (x,y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate Polynomial Ring in x, y over Rational Field, QQMPolyRingElem[x, y])

julia> C = Oscar.AffinePlaneCurve(y^2 + y + x^2)
Affine plane curve defined by x^2 + y^2 + y

julia> P = Oscar.Point([QQ(0), QQ(0)])
Point with coordinates QQFieldElem[0, 0]

julia> Q = Oscar.Point([QQ(0), QQ(-1)])
Point with coordinates QQFieldElem[0, -1]

julia> Oscar.AffineCurveDivisor(C, Dict(P => 3, Q => -2))
3*QQFieldElem[0, 0] - 2*QQFieldElem[0, -1]
source
ProjCurveDivisorType
ProjCurveDivisor(C::ProjPlaneCurve{S}, D::Dict{Oscar.Geometry.ProjSpcElem{S}, Int}) where S <: FieldElem

Given a curve C which is assumed to be smooth and irreducible, return the divisor on the curve C defined by D.

Examples

julia> S, (x,y,z) = polynomial_ring(QQ, ["x", "y", "z"])
(Multivariate Polynomial Ring in x, y, z over Rational Field, QQMPolyRingElem[x, y, z])

(Multivariate Polynomial Ring in x, y, z over Rational Field graded by
x -> [1]
y -> [1]
z -> [1], MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])

julia> C = Oscar.ProjPlaneCurve(T(y^2 + y*z + x^2))
Projective plane curve defined by x^2 + y^2 + y*z

julia> PP = proj_space(QQ, 2)
(Projective space of dim 2 over Rational Field
, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[0], x[1], x[2]])

julia> P = Oscar.Geometry.ProjSpcElem(PP[1], [QQ(0), QQ(0), QQ(1)])
(0 : 0 : 1)

julia> Q = Oscar.Geometry.ProjSpcElem(PP[1], [QQ(0), QQ(-1), QQ(1)])
(0 : -1 : 1)

julia> D = Oscar.ProjCurveDivisor(C, Dict(P => 3, Q => -2))
3*(0 : 0 : 1) - 2*(0 : 1 : -1)
source

To define the divisor $0$ of the group of divisors, one uses the following method:

curve_zero_divisorMethod
curve_zero_divisor(C::ProjPlaneCurve{S}) where S <: FieldElem

Return the divisor 0 on the curve C.

source
curve_zero_divisorMethod
curve_zero_divisor(C::AffinePlaneCurve{S}) where S <: FieldElem

Return the divisor 0 on the curve C.

source

## Methods

The following functions on divisors of curves are implemented.

curveMethod
curve(D::CurveDivisor)

Return the curve on which the divisor is considered.

source
is_effectiveMethod
is_effective(D::CurveDivisor)

Return true if D is an effective divisor, false otherwise.

Examples

julia> R, (x,y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate Polynomial Ring in x, y over Rational Field, QQMPolyRingElem[x, y])

julia> C = Oscar.AffinePlaneCurve(y^2 + y + x^2)
Affine plane curve defined by x^2 + y^2 + y

julia> P = Oscar.Point([QQ(0), QQ(0)])
Point with coordinates QQFieldElem[0, 0]

julia> Q = Oscar.Point([QQ(0), QQ(-1)])
Point with coordinates QQFieldElem[0, -1]

julia> D = Oscar.AffineCurveDivisor(C, Dict(P => 3, Q => -2))
3*QQFieldElem[0, 0] - 2*QQFieldElem[0, -1]

julia> Oscar.is_effective(D)
false
source
is_linearly_equivalentMethod
is_linearly_equivalent(D::ProjCurveDivisor, E::ProjCurveDivisor)

Return true if the divisors D and E are linearly equivalent, and false otherwise

Examples

julia> S, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"])
(Multivariate Polynomial Ring in x, y, z over Rational Field, QQMPolyRingElem[x, y, z])

(Multivariate Polynomial Ring in x, y, z over Rational Field graded by
x -> [1]
y -> [1]
z -> [1], MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])

julia> C = Oscar.ProjPlaneCurve(T(y^2*z - x*(x-z)*(x+3*z)))
Projective plane curve defined by -x^3 - 2*x^2*z + 3*x*z^2 + y^2*z

julia> PP = proj_space(QQ, 2)
(Projective space of dim 2 over Rational Field
, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[0], x[1], x[2]])

julia> P = Oscar.Geometry.ProjSpcElem(PP[1], [QQ(0), QQ(1), QQ(0)])
(0 : 1 : 0)

julia> R = Oscar.Geometry.ProjSpcElem(PP[1], [QQ(0), QQ(0), QQ(1)])
(0 : 0 : 1)

julia> E = Oscar.ProjCurveDivisor(C, P)
(0 : 1 : 0)

julia> F = Oscar.ProjCurveDivisor(C, R)
(0 : 0 : 1)

julia> Oscar.is_linearly_equivalent(E, F)
false
source
is_principalMethod
is_principal(D::ProjCurveDivisor{S}) where S <: FieldElem

Return true if the divisor D is principal, and false otherwise

Examples

julia> S, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"])
(Multivariate Polynomial Ring in x, y, z over Rational Field, QQMPolyRingElem[x, y, z])

(Multivariate Polynomial Ring in x, y, z over Rational Field graded by
x -> [1]
y -> [1]
z -> [1], MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])

julia> C = Oscar.ProjPlaneCurve(T(y^2*z - x*(x-z)*(x+3*z)))
Projective plane curve defined by -x^3 - 2*x^2*z + 3*x*z^2 + y^2*z

julia> PP = proj_space(QQ, 2)
(Projective space of dim 2 over Rational Field
, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[0], x[1], x[2]])

julia> P = Oscar.Geometry.ProjSpcElem(PP[1], [QQ(0), QQ(1), QQ(0)])
(0 : 1 : 0)

julia> E = Oscar.ProjCurveDivisor(C, P)
(0 : 1 : 0)

julia> Oscar.is_principal(E)
false
source
principal_divisorMethod
principal_divisor(D::ProjCurveDivisor{S}) where S <: FieldElem

If the divisor D is principal, return a rational function phi such that D is linearly equivalent to the divisor defined by phi.

Examples

julia> S, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"])
(Multivariate Polynomial Ring in x, y, z over Rational Field, QQMPolyRingElem[x, y, z])

(Multivariate Polynomial Ring in x, y, z over Rational Field graded by
x -> [1]
y -> [1]
z -> [1], MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])

julia> C = Oscar.ProjPlaneCurve(T(y^2*z - x*(x-z)*(x+3*z)))
Projective plane curve defined by -x^3 - 2*x^2*z + 3*x*z^2 + y^2*z

julia> PP = proj_space(QQ, 2)
(Projective space of dim 2 over Rational Field
, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[0], x[1], x[2]])

julia> P = Oscar.Geometry.ProjSpcElem(PP[1], [QQ(0), QQ(1), QQ(0)])
(0 : 1 : 0)

julia> R = Oscar.Geometry.ProjSpcElem(PP[1], [QQ(0), QQ(0), QQ(1)])
(0 : 0 : 1)

julia> E = Oscar.ProjCurveDivisor(C, P, 2)
2*(0 : 1 : 0)

julia> F = Oscar.ProjCurveDivisor(C, R, 2)
2*(0 : 0 : 1)

julia> G = 2*E - 2*F
-4*(0 : 0 : 1) + 4*(0 : 1 : 0)

julia> Oscar.principal_divisor(G)
x^2//z^2
source
global_sectionsMethod
global_sections(D::ProjCurveDivisor)

Return a set of generators of the global sections of the sheaf associated to the divisor D of a smooth and irreducible projective curve.

Examples

julia> S, (x, y, z) = polynomial_ring(QQ, ["x", "y", "z"])
(Multivariate Polynomial Ring in x, y, z over Rational Field, QQMPolyRingElem[x, y, z])

(Multivariate Polynomial Ring in x, y, z over Rational Field graded by
x -> [1]
y -> [1]
z -> [1], MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])

julia> C = Oscar.ProjPlaneCurve(T(y^2*z - x*(x-z)*(x+3*z)))
Projective plane curve defined by -x^3 - 2*x^2*z + 3*x*z^2 + y^2*z

julia> PP = proj_space(QQ, 2)
(Projective space of dim 2 over Rational Field
, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[0], x[1], x[2]])

julia> P = Oscar.Geometry.ProjSpcElem(PP[1], [QQ(0), QQ(1), QQ(0)])
(0 : 1 : 0)

julia> D = Oscar.ProjCurveDivisor(C, P, 4)
4*(0 : 1 : 0)

julia> Oscar.global_sections(D)
4-element Vector{AbstractAlgebra.Generic.Frac{QQMPolyRingElem}}:
1
y//z
x//z
x^2//z^2
source
dimension_global_sectionsMethod
dimension_global_sections(D::ProjCurveDivisor)

Return the dimension of the global sections of the sheaf associated to the divisor D of a smooth and irreducible projective curve.

source

In addition, the multiplicity of a polynomial or a fraction at a given point can be computed:

multiplicityMethod
multiplicity(C::AffinePlaneCurve{S}, phi::AbstractAlgebra.Generic.Frac{T}, P::Point{S}) where {S <: FieldElem, T <: MPolyRingElem{S}}
multiplicity(C::ProjPlaneCurve{S}, phi::AbstractAlgebra.Generic.Frac{T}, P::Oscar.Geometry.ProjSpcElem{S})  where {S <: FieldElem, T <: Oscar.MPolyDecRingElem{S}}

Return the multiplicity of the rational function phi on the curve C at the point P.

Examples

julia> S, (x,y,z) = polynomial_ring(QQ, ["x", "y", "z"])
(Multivariate Polynomial Ring in x, y, z over Rational Field, QQMPolyRingElem[x, y, z])

(Multivariate Polynomial Ring in x, y, z over Rational Field graded by
x -> [1]
y -> [1]
z -> [1], MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])

julia> C = Oscar.ProjPlaneCurve(T(y^2 + y*z + x^2))
Projective plane curve defined by x^2 + y^2 + y*z

julia> PP = proj_space(QQ, 2)
(Projective space of dim 2 over Rational Field
, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[0], x[1], x[2]])

julia> P = Oscar.Geometry.ProjSpcElem(PP[1], [QQ(0), QQ(0), QQ(1)])
(0 : 0 : 1)

julia> phi = T(x)//T(y)
x//y

julia> Oscar.multiplicity(C, phi, P)
-1
source
multiplicityMethod
multiplicity(C::AffinePlaneCurve{S}, F::Oscar.MPolyRingElem{S}, P::Point{S}) where S <: FieldElem
multiplicity(C::ProjPlaneCurve{S}, F::Oscar.MPolyDecRingElem{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElem

Return the multiplicity of the polynomial F on the curve C at the point P.

source

The divisor of a polynomial or a fraction along a plane curve can be computed, but will give only the points which belong to the base field.

divisorMethod
divisor(C::AffinePlaneCurve{S}, F::Oscar.MPolyRingElem{S}) where S <: FieldElem

Return the divisor defined by the polynomial F on the curve C.

source
divisorMethod
divisor(C::AffinePlaneCurve{S}, phi::AbstractAlgebra.Generic.Frac{T}) where {S <: FieldElem, T <: MPolyRingElem{S}}

Return the divisor defined by the rational function phi on the curve C.

source
divisorMethod
divisor([PP::Oscar.Geometry.ProjSpc{S}], C::ProjPlaneCurve{S}, F::Oscar.MPolyDecRingElem{S}) where S <: FieldElem

Return the divisor defined by the polynomial F on the curve C. The points of the divisor are in the projective space PP if specified, or in a new projective space otherwise.

source
divisorMethod
divisor(PP::Oscar.Geometry.ProjSpc{S}, C::ProjPlaneCurve{S}, phi::AbstractAlgebra.Generic.Frac{T})  where {S <: FieldElem, T <: Oscar.MPolyDecRingElem{S}}

Return the divisor defined by the rational function phi on the curve C.

Examples

julia> S, (x,y,z) = polynomial_ring(QQ, ["x", "y", "z"])
(Multivariate Polynomial Ring in x, y, z over Rational Field, QQMPolyRingElem[x, y, z])

(Multivariate Polynomial Ring in x, y, z over Rational Field graded by
x -> [1]
y -> [1]
z -> [1], MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])

julia> C = Oscar.ProjPlaneCurve(T(y^2 + y*z + x^2))
Projective plane curve defined by x^2 + y^2 + y*z

julia> PP = proj_space(QQ, 2)
(Projective space of dim 2 over Rational Field
, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x[0], x[1], x[2]])

julia> phi = T(x)//T(y)
x//y

julia> Oscar.divisor(PP[1], C, phi)
-(0 : 0 : 1) + (0 : 1 : -1)
source