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 <: FieldElemGiven 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 <: FieldElemGiven 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 <: FieldElemReturn the divisor 0 on the curve C.
curve_zero_divisor — Methodcurve_zero_divisor(C::AffinePlaneCurve{S}) where S <: FieldElemReturn 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)
falseis_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)
falseis_principal — Methodis_principal(D::ProjCurveDivisor{S}) where S <: FieldElemReturn 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)
falseprincipal_divisor — Methodprincipal_divisor(D::ProjCurveDivisor{S}) where S <: FieldElemIf 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^2global_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^2dimension_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)
-1multiplicity — 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 <: FieldElemReturn 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 <: FieldElemReturn 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 <: FieldElemReturn 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)