# Affine and Projective Plane Curves

We consider two kinds of plane curves: affine and projective. An affine plane curve is defined by a polynomial in two variables, whereas a projective plane curve is defined by a homogeneous polynomial belonging to a graded polynomial ring in three variables.

## Affine Plane Curves

An affine plane curve is defined as the class of a two-variables polynomial $F$ over a field $K$, modulo the equivalence relation $F \sim G \iff \exists \lambda \in K\backslash \{0\}, F = \lambda \cdot G$.

### Example

AffinePlaneCurveType
AffinePlaneCurve{S}(eq::Oscar.MPolyRingElem{S}) where S <: FieldElem

Return the Affine Plane Curve defined by the polynomial in two variables eq.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

julia> F = y^3*x^6 - y^6*x^2
x^6*y^3 - x^2*y^6

julia> C = AffinePlaneCurve(F)
Affine plane curve defined by x^6*y^3 - x^2*y^6
source

## Projective Plane Curves

Similarly, a projective plane curve is defined as the class of a three-variables homogeneous polynomial $F$ over a field $K$, modulo the equivalence relation $F\sim G \iff \exists \lambda \in K\backslash \{0\}, F = \lambda \cdot G$. The defining equation is supposed to belong to a graded ring.

ProjPlaneCurveType
ProjPlaneCurve{S}(eq::Oscar.MPolyDecRingElem{S}) where {S <: FieldElem}

Return the Projective Plane Curve defined by the homogeneous polynomial in three variables eq.

Examples

julia> R, (x,y,z) = polynomial_ring(QQ, ["x", "y", "z"])
(Multivariate polynomial ring in 3 variables over QQ, QQMPolyRingElem[x, y, z])

(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])

julia> F = T(y^3*x^6 - y^6*x^2*z)
x^6*y^3 - x^2*y^6*z

julia> ProjPlaneCurve(F)
Projective plane curve defined by x^6*y^3 - x^2*y^6*z
source

A particular kind of projective curves is the case of elliptic curves, see the corresponding section for more information. The types ProjPlaneCurve and ProjEllipticCurve are subtypes of the abstract type ProjectivePlaneCurve. In addition, the types AffinePlaneCurve and ProjectivePlaneCurve are subtypes of the abstract type PlaneCurve.

## Points

When considering curves, it is natural to have a look at points on the curve. We describe in this section how to deal with points, both in the affine and projective settings.

### Point in the affine space

A point in the affine space can be defined as follows:

PointType
Point(coordinates::Vector{S}) where {S <: FieldElem}

Return the point with the given coordinates.

Examples

julia> P = Point([QQ(1), QQ(2), QQ(2)])
Point with coordinates QQFieldElem[1, 2, 2]
source

We consider also the following function for points.

ideal_pointMethod
ideal_point(R::MPolyRing{S}, P::Point{S}) where S <: FieldElem

Return the maximal ideal associated to the point P in the ring R.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

julia> P = Point([QQ(2), QQ(1)])
Point with coordinates QQFieldElem[2, 1]

julia> Oscar.ideal_point(R, P)
ideal(x - 2, y - 1)
source

The following function checks if a given point is on a curve:

inMethod
in(P::Point{S}, C::AffinePlaneCurve{S}) where S <: FieldElem

Return true if the point P is on the curve C, and false otherwise.

source

### Point in the projective space

In order to define a point in the projective plane, one needs first to define the projective plane as follows, where K is the base ring:

julia> K = QQ
Rational field

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


Then, one can define a projective point as follows:

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


The following function checks if a given point is on a curve:

inMethod
in(P::Oscar.Geometry.ProjSpcElem{S}, C::ProjectivePlaneCurve{S}) where S <: FieldElem

Return true if the point P is on the curve C, and false otherwise.

source

## General functions for curves

degreeMethod
degree(C::PlaneCurve)

Return the degree of the defining polynomial of C.

source
ringMethod
ring(C::PlaneCurve)

Return the coordinate ring of the curve C.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

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

julia> Oscar.ring(C)
(Quotient of multivariate polynomial ring by ideal with 1 generator, Map from
Multivariate polynomial ring in 2 variables over QQ to Quotient of multivariate polynomial ring by ideal with 1 generator defined by a julia-function with inverse)
source
curve_componentsMethod
curve_components(C::PlaneCurve{S}) where S <: FieldElem

Return a dictionary containing the irreducible components of C and their multiplicity.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

julia> C = AffinePlaneCurve(y^3*x^6 - y^6*x^2)
Affine plane curve defined by x^6*y^3 - x^2*y^6

julia> Oscar.curve_components(C)
Dict{AffinePlaneCurve{QQFieldElem}, Int64} with 3 entries:
y         => 3
x         => 2
x^4 - y^3 => 1
source
reductionMethod
reduction(C::AffinePlaneCurve{S}) where S <: FieldElem
reduction(C::ProjPlaneCurve{S}) where S <: FieldElem

Return the plane curve defined by the squarefree part of the equation of C.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

julia> C = AffinePlaneCurve(y^3*x^6 - y^6*x^2)
Affine plane curve defined by x^6*y^3 - x^2*y^6

julia> Oscar.reduction(C)
Affine plane curve defined by x^5*y - x*y^4
source
is_irreducibleMethod
is_irreducible(C::PlaneCurve{S}) where S <: FieldElem

Return true if C is irreducible, and 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 = AffinePlaneCurve(y^2+x-x^3)
Affine plane curve defined by -x^3 + x + y^2

julia> Oscar.is_irreducible(C)
true

julia> D = AffinePlaneCurve(y^3*x^6 - y^6*x^2)
Affine plane curve defined by x^6*y^3 - x^2*y^6

julia> Oscar.is_irreducible(D)
false
source
is_reducedMethod
is_reduced(C::PlaneCurve{S}) where S <: FieldElem

Return true if C is reduced, and 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 = AffinePlaneCurve(y^2+x-x^3)
Affine plane curve defined by -x^3 + x + y^2

julia> Oscar.is_reduced(C)
true

julia> D = AffinePlaneCurve(y^3*x^6 - y^6*x^2)
Affine plane curve defined by x^6*y^3 - x^2*y^6

julia> Oscar.is_reduced(D)
false
source
unionMethod
union(C::T, D::T) where T <: PlaneCurve

Return the union of C and D (with multiplicity).

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

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

julia> D = AffinePlaneCurve(y^3*x^6 - y^6*x^2)
Affine plane curve defined by x^6*y^3 - x^2*y^6

julia> union(C, D)
Affine plane curve defined by -x^9*y^3 + x^7*y^3 + x^6*y^5 + x^5*y^6 - x^3*y^6 - x^2*y^8
source
arithmetic_genusMethod
arithmetic_genus(C::ProjectivePlaneCurve)

Return the arithmetic genus of 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])

(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])

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

julia> Oscar.PlaneCurveModule.arithmetic_genus(C)
1
source
arithmetic_genusMethod
arithmetic_genus(C::AffinePlaneCurve)

Return the arithmetic genus of the projective closure of C.

source
geometric_genusMethod
geometric_genus(C::ProjectivePlaneCurve{T}) where T <: FieldElem

Return the geometric genus of C.

Examples

julia> R, (x,y,z) = graded_polynomial_ring(QQ, ["x", "y", "z"]);

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

julia> geometric_genus(C)
0
source
geometric_genusMethod
geometric_genus(C::AffinePlaneCurve)

Return the geometric genus of the projective closure of C.

Examples

julia> R, (x, y) = polynomial_ring(GF(7), ["x", "y"])
(Multivariate polynomial ring in 2 variables over GF(7), fpMPolyRingElem[x, y])

julia> C = AffinePlaneCurve(y^9 - x^2*(x-1)^9)
Affine plane curve defined by 6*x^11 + 2*x^10 + 6*x^9 + x^4 + 5*x^3 + x^2 + y^9

julia> geometric_genus(C)
0
source
jacobi_idealMethod
jacobi_ideal(C::PlaneCurve)

Return the Jacobian ideal of the defining polynomial of C.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

julia> C = AffinePlaneCurve(y^3*x^6 - y^6*x^2)
Affine plane curve defined by x^6*y^3 - x^2*y^6

julia> Oscar.jacobi_ideal(C)
ideal(6*x^5*y^3 - 2*x*y^6, 3*x^6*y^2 - 6*x^2*y^5)
source
is_smoothMethod
is_smooth(C::AffinePlaneCurve{S}, P::Point{S}) where S <: FieldElem

Throw an error if P is not a point of C, return false if P is a singular point of C, and true if P is a smooth point of C.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

julia> C = AffinePlaneCurve(x^2*(x+y)*(y^3-x^2))
Affine plane curve defined by -x^5 - x^4*y + x^3*y^3 + x^2*y^4

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

julia> is_smooth(C, P)
false
source
is_smoothMethod
is_smooth(C::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElem

Throw an error if P is not a point of C, return false if P is a singular point of C, and true if P is a smooth point of 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])

(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])

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

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> is_smooth(C, P)
false
source
tangentMethod
tangent(C::AffinePlaneCurve{S}, P::Point{S}) where S <: FieldElem

Return the tangent of C at P when P is a smooth point of C, and throw an error otherwise.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

julia> C = AffinePlaneCurve(x^2*(x+y)*(y^3-x^2))
Affine plane curve defined by -x^5 - x^4*y + x^3*y^3 + x^2*y^4

julia> P2 = Point([QQ(2), QQ(-2)])
Point with coordinates QQFieldElem[2, -2]

julia> tangent(C, P2)
Affine plane curve defined by -48*x - 48*y
source
tangentMethod
tangent(C::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElem

Return the tangent of C at P when P is a smooth point of C, and throw an error 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])

(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, 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> C = ProjPlaneCurve(x^2*(x+y)*(y^3-x^2*z))
Projective plane curve defined by -x^5*z - x^4*y*z + x^3*y^3 + x^2*y^4

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

julia> tangent(C, P)
Projective plane curve defined by -48*x - 48*y
source
curve_singular_locusMethod
curve_singular_locus(C::AffinePlaneCurve)

Return the reduced singular locus of C as a list whose first element is the affine plane curve consisting of the singular components of C (if any), and the second element is the list of the isolated singular points (which may be contained in the singular component). The singular component might not contain any point over the considered field.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

julia> C = AffinePlaneCurve(x^2*(x+y)*(y^3-x^2))
Affine plane curve defined by -x^5 - x^4*y + x^3*y^3 + x^2*y^4

julia> curve_singular_locus(C)
2-element Vector{Vector}:
AffinePlaneCurve[Affine plane curve defined by x]
Point[Point with coordinates QQFieldElem[-1, 1], Point with coordinates QQFieldElem[0, 0]]
source
curve_singular_locusMethod
curve_singular_locus([PP::Oscar.Geometry.ProjSpc{S}], C::ProjectivePlaneCurve{S}) where S <: FieldElem

Return the reduced singular locus of C as a list whose first element is the projective plane curve consisting of the singular components of C (if any), and the second element is the list of the singular points of the reduction of C (the points are in PP if specified, or in a new projective space otherwise). The singular component might not contain any point over the considered field.

source
multiplicityMethod
multiplicity(C::AffinePlaneCurve{S}, P::Point{S}) where S <: FieldElem

Return the multiplicity of C at P.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

julia> C = AffinePlaneCurve(x^2*(x+y)*(y^3-x^2))
Affine plane curve defined by -x^5 - x^4*y + x^3*y^3 + x^2*y^4

julia> P = Point([QQ(2), QQ(-2)])
Point with coordinates QQFieldElem[2, -2]

julia> multiplicity(C, P)
1
source
multiplicityMethod
 multiplicity(C::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElem

Return the multiplicity of C at P.

source
tangent_linesMethod
tangent_lines(C::AffinePlaneCurve{S}, P::Point{S}) where S <: FieldElem

Return the tangent lines at P to C with their multiplicity.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

julia> C = AffinePlaneCurve(x^2*(x+y)*(y^3-x^2))
Affine plane curve defined by -x^5 - x^4*y + x^3*y^3 + x^2*y^4

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

julia> tangent_lines(C, P)
Dict{AffinePlaneCurve{QQFieldElem}, Int64} with 2 entries:
x     => 4
x + y => 1
source
tangent_linesMethod
  tangent_lines(C::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElem

Return the tangent lines at P to C with their multiplicity.

source
is_smooth_curveMethod
is_smooth_curve(C::AffinePlaneCurve)

Return true if C has no singular point, and 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 = AffinePlaneCurve(x*(x+y))
Affine plane curve defined by x^2 + x*y

julia> is_smooth_curve(C)
false
source
is_smooth_curveMethod
is_smooth_curve(C::ProjectivePlaneCurve)

Return true if C has no singular point, and false otherwise.

source

## Intersection of curves

common_componentsMethod
common_components(C::AffinePlaneCurve{S}, D::AffinePlaneCurve{S}) where S <: FieldElem

Return the affine plane curve consisting of the common component of C and D, or an empty vector if they do not have a common component.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

julia> C = AffinePlaneCurve(x*(x+y)*(x^2 + x + 1))
Affine plane curve defined by x^4 + x^3*y + x^3 + x^2*y + x^2 + x*y

julia> D = AffinePlaneCurve(x*(x+y)*(x-y))
Affine plane curve defined by x^3 - x*y^2

julia> common_components(C, D)
1-element Vector{AffinePlaneCurve{QQFieldElem}}:
Affine plane curve defined by x^2 + x*y
source
common_componentsMethod
common_components(C::ProjectivePlaneCurve{S}, D::ProjectivePlaneCurve{S}) where S <: FieldElem

Return the projective plane curve consisting of the common component of C and D, or an empty vector if they do not have a common component.

source
curve_intersectMethod
curve_intersect(C::AffinePlaneCurve{S}, D::AffinePlaneCurve{S}) where S <: FieldElem

Return a list whose first element is the affine plane curve defined by the gcd of C.eq and D.eq, the second element is the list of the remaining intersection points when the common components are removed from C and D.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

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

julia> D = AffinePlaneCurve((x-y)*(x-2))
Affine plane curve defined by x^2 - x*y - 2*x + 2*y

julia> curve_intersect(C, D)
2-element Vector{Vector}:
AffinePlaneCurve[]
Point{QQFieldElem}[Point with coordinates QQFieldElem[0, 0], Point with coordinates QQFieldElem[2, -2]]
source
curve_intersectMethod
curve_intersect([PP::Oscar.Geometry.ProjSpc{S}], C::ProjectivePlaneCurve{S}, D::ProjectivePlaneCurve{S}) where S <: FieldElem

Return a list whose first element is the projective plane curve defined by the gcd of C.eq and D.eq, the second element is the list of the remaining intersection points when the common components are removed from C and D (the points are in PP if specified, or in a new projective space 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])

(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, 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> C = ProjPlaneCurve(T(x+y+z))
Projective plane curve defined by x + y + z

julia> D = ProjPlaneCurve(T(z))
Projective plane curve defined by z

julia> curve_intersect(PP[1], C, D)
2-element Vector{Vector{Any}}:
[]
[(-1 : 1 : 0)]
source
intersection_multiplicityMethod
intersection_multiplicity(C::AffinePlaneCurve{S}, D::AffinePlaneCurve{S}, P::Point{S}) where S <: FieldElem

Return the intersection multiplicity of C and D at P.

Examples

julia> R, (x, y) = polynomial_ring(QQ, ["x", "y"])
(Multivariate polynomial ring in 2 variables over QQ, QQMPolyRingElem[x, y])

julia> C = AffinePlaneCurve((x^2+y^2)*(x^2 + y^2 + 2*y))
Affine plane curve defined by x^4 + 2*x^2*y^2 + 2*x^2*y + y^4 + 2*y^3

julia> D = AffinePlaneCurve((x^2+y^2)*(y^3*x^6 - y^6*x^2))
Affine plane curve defined by x^8*y^3 + x^6*y^5 - x^4*y^6 - x^2*y^8

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

julia> intersection_multiplicity(C, D, Q)
2
source
intersection_multiplicityMethod
 intersection_multiplicity(C::ProjectivePlaneCurve{S}, D::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S <: FieldElem

Return the intersection multiplicity of C and D at P.

source
aretransverseMethod
aretransverse(C::AffinePlaneCurve{S}, D::AffinePlaneCurve{S}, P::Point{S}) where S<:FieldElem

Return true if C and D intersect transversally at P and 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 = AffinePlaneCurve(x*(x+y))
Affine plane curve defined by x^2 + x*y

julia> D = AffinePlaneCurve((x-y)*(x-2))
Affine plane curve defined by x^2 - x*y - 2*x + 2*y

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

julia> Q = Point([QQ(2), QQ(-2)])
Point with coordinates QQFieldElem[2, -2]

julia> aretransverse(C, D, P)
false

julia> aretransverse(C, D, Q)
true
source
aretransverseMethod
 aretransverse(C::ProjectivePlaneCurve{S}, D::ProjectivePlaneCurve{S}, P::Oscar.Geometry.ProjSpcElem{S}) where S<:FieldElem

Return true if C and D intersect transversally at P and false otherwise.

source