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.
AffineCurveDivisor
— TypeAffineCurveDivisor(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 2 variables over QQ, 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))
-2*QQFieldElem[0, -1] + 3*QQFieldElem[0, 0]
ProjCurveDivisor
— TypeProjCurveDivisor(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 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> T, _ = grade(S)
(Graded multivariate polynomial ring in 3 variables over QQ, 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))
-2*(0 : 1 : -1) + 3*(0 : 0 : 1)
To define the divisor $0$ of the group of divisors, one uses the following method:
curve_zero_divisor
— Methodcurve_zero_divisor(C::ProjPlaneCurve{S}) where S <: FieldElem
Return the divisor 0
on the curve C
.
curve_zero_divisor
— Methodcurve_zero_divisor(C::AffinePlaneCurve{S}) where S <: FieldElem
Return the divisor 0
on the curve C
.
Methods
The following functions on divisors of curves are implemented.
curve
— Methodcurve(D::CurveDivisor)
Return the curve on which the divisor is considered.
degree
— Methoddegree(D::CurveDivisor)
Return the degree of the divisor.
is_effective
— Methodis_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 2 variables over QQ, 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))
-2*QQFieldElem[0, -1] + 3*QQFieldElem[0, 0]
julia> Oscar.is_effective(D)
false
is_linearly_equivalent
— Methodis_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 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> T, _ = grade(S)
(Graded multivariate polynomial ring in 3 variables over QQ, 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
is_principal
— Methodis_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 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> T, _ = grade(S)
(Graded multivariate polynomial ring in 3 variables over QQ, 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
principal_divisor
— Methodprincipal_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 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> T, _ = grade(S)
(Graded multivariate polynomial ring in 3 variables over QQ, 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 : 1 : 0) - 4*(0 : 0 : 1)
julia> Oscar.principal_divisor(G)
x^2//z^2
global_sections
— Methodglobal_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 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> T, _ = grade(S)
(Graded multivariate polynomial ring in 3 variables over QQ, 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
dimension_global_sections
— Methoddimension_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.
In addition, the multiplicity of a polynomial or a fraction at a given point can be computed:
multiplicity
— Methodmultiplicity(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 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> T, _ = grade(S)
(Graded multivariate polynomial ring in 3 variables over QQ, 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
multiplicity
— Methodmultiplicity(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
.
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.
divisor
— Methoddivisor(C::AffinePlaneCurve{S}, F::Oscar.MPolyRingElem{S}) where S <: FieldElem
Return the divisor defined by the polynomial F
on the curve C
.
divisor
— Methoddivisor(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
.
divisor
— Methoddivisor([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.
divisor
— Methoddivisor(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 3 variables over QQ, QQMPolyRingElem[x, y, z])
julia> T, _ = grade(S)
(Graded multivariate polynomial ring in 3 variables over QQ, 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 : 1 : -1) - (0 : 0 : 1)