# Projective Plane Curves

`ProjectivePlaneCurve`

— Type`ProjectivePlaneCurve <: AbsProjectiveCurve`

A reduced curve in the projective plane.

**Examples**

```
julia> R, (x,y,z) = graded_polynomial_ring(QQ, ["x", "y", "z"]);
julia> C = plane_curve(y^3*x^6 - y^6*x^2*z)
Projective plane curve
defined by 0 = x^5*y - x*y^4*z
```

Projective plane curves are modeled in Oscar as projective algebraic sets. See `AbsProjectiveAlgebraicSet`

(@ref). In addition to the methods for algebraic sets the following methods special to plane curves are available.

`defining_equation`

— Method`defining_equation(C::AffinePlaneCurve)`

Return the defining equation of `C`

.

`defining_equation(C::ProjectivePlaneCurve)`

Return the defining equation of the (reduced) plane curve `C`

.

`degree`

— Method`degree(C::ProjectivePlaneCurve)`

Return the degree of the defining polynomial of `C`

.

`common_components`

— Method`common_components(C::S, D::S) where {S<:ProjectivePlaneCurve}`

Return the projective plane curve consisting of the common components of `C`

and `D`

, or an empty vector if they do not have a common component.

`multiplicity`

— Method` multiplicity(C::ProjectivePlaneCurve{S}, P::AbsProjectiveRationalPoint)`

Return the multiplicity of `C`

at `P`

.

`tangent_lines`

— Method` tangent_lines(C::ProjectivePlaneCurve{S}, P::AbsProjectiveRationalPoint) where S <: FieldElem`

Return the tangent lines at `P`

to `C`

with their multiplicity.

`intersection_multiplicity`

— Method` intersection_multiplicity(C::S, D::S, P::AbsProjectiveRationalPoint) where S <: ProjectivePlaneCurve`

Return the intersection multiplicity of `C`

and `D`

at `P`

.

`is_transverse_intersection`

— Method` is_transverse_intersection(C::S, D::S, P::AbsProjectiveRationalPoint) where S <: ProjectivePlaneCurve`

Return `true`

if `C`

and `D`

intersect transversally at `P`

and `false`

otherwise.

`arithmetic_genus`

— Method`arithmetic_genus(C::ProjectivePlaneCurve)`

Return the arithmetic genus of `C`

.

**Examples**

```
julia> T, (x, y, z) = graded_polynomial_ring(QQ, ["x", "y", "z"]);
julia> C = plane_curve(y^2 * z - x^3 - x * z^2)
Projective plane curve
defined by 0 = x^3 + x*z^2 - y^2*z
julia> arithmetic_genus(C)
1
```

`geometric_genus`

— Method`geometric_genus(C::ProjectivePlaneCurve; check::Bool=true)`

Return the geometric genus of `C`

.

If `C`

is singular this is defined as the geometric genus of any smooth birational model of `C`

.

If `check`

is true, checks that `C`

is an irreducible curve.

**Examples**

```
julia> R, (x,y,z) = graded_polynomial_ring(QQ, ["x", "y", "z"]);
julia> C = plane_curve(z*x^2-y^3)
Projective plane curve
defined by 0 = x^2*z - y^3
julia> geometric_genus(C)
0
```

# Rational Parametrizations of Rational Plane Curves

In this section, $C$ will denote a complex projective plane curve, defined by an absolutely irreducible, homogeneous polynomial in three variables, with coefficients in $\mathbb Q$. Moreover, we will write $n = \deg C$.

Recall that the curve $C$ is *rational* if it is birationally equivalent to the projective line $\mathbb P^1(\mathbb C)$. In other words, there exists a *rational parametrization* of $C$, that is, a birational map $\mathbb P^1(\mathbb C)\dashrightarrow C$. Note that such a parametrization is given by three homogeneous polynomials of the same degree in the homogeneous coordinates on $\mathbb P^1(\mathbb C)$.

The curve $C$ is rational iff its geometric genus is zero.

Based on work of Max Noether on adjoint curves, Hilbert und Hurwitz showed that if $C$ is rational, then there is a birational map $C \dashrightarrow D$ defined over $\mathbb Q$ such that $D = \mathbb P^1(\mathbb C)$ if $n$ is odd, and $D\subset\mathbb P^2(\mathbb C)$ is a conic if $n$ is even.

If a conic $D$ contains a rational point, then there exists a parametrization of $D$ defined over $\mathbb Q$; otherwise, there exists a parametrization of $D$ defined over a quadratic field extension of $\mathbb Q$.

The approach of Hilbert und Hurwitz is constructive and allows one, in principle, to find rational parametrizations. The resulting algorithm is not very practical, however, as the approach asks to compute adjoint curves repeatedly, at each of a number of reduction steps.

The algorithm implemented in OSCAR relies on reduction steps of a different type and requires the computation of adjoint curves only once. Its individual steps are interesting in their own right:

- Assure that the curve $C$ is rational by checking that its geometric genus is zero;
- compute a basis of the adjoint curves of $C$ of degree ${n-2}$; each such basis defines a birational map $C \dashrightarrow C_{n-2},$ where $C_{n-2}$ is a rational normal curve in $\mathbb P^{n-2}(\mathbb C)$;
- the anticanonical linear system on $C_{n-2}$ defines a birational map $C_{n-2}\dashrightarrow C_{n-4}$, where $C_{n-4}$ is a rational normal curve in in $\mathbb P^{n-4}(\mathbb C)$;
- iterate the previous step to obtain a birational map $C_{n-2} \dashrightarrow \dots \dashrightarrow D$, where $D = \mathbb P^1(\mathbb C)$ if $n$ is odd, and $D\subset\mathbb P^2(\mathbb C)$ is a conic if $n$ is even;
- invert the birational map $C \dashrightarrow C_{n-2} \dashrightarrow \dots \dashrightarrow D$;
- if $n$ is even, compute a parametrization of the conic $D$ and compose it with the inverted map above.

The defining property of an adjoint curve is that it passes with “sufficiently high” multiplicity through the singularities of $C$. There are several concepts of making this precise. For each such concept, there is a corresponding *adjoint ideal* of $C$, namely the homogeneous ideal formed by the defining polynomials of the adjoint curves. In OSCAR, we follow the concept of Gorenstein which leads to the largest possible adjoint ideal.

See [Bhm99] and [BDLP17] for details and further references.

## Adjoint Ideals of Plane Curves

`adjoint_ideal`

— Method`adjoint_ideal(C::ProjectivePlaneCurve{QQField})`

Return the Gorenstein adjoint ideal of `C`

.

**Examples**

```
julia> R, (x,y,z) = graded_polynomial_ring(QQ, ["x", "y", "z"]);
julia> C = ProjectivePlaneCurve(y^4-2*x^3*z+3*x^2*z^2-2*y^2*z^2)
Projective plane curve
defined by 0 = 2*x^3*z - 3*x^2*z^2 - y^4 + 2*y^2*z^2
julia> I = adjoint_ideal(C)
Ideal generated by
-x*z + y^2
x*y - y*z
x^2 - x*z
```

## Rational Points on Conics

`rational_point_conic`

— Method`rational_point_conic(D::ProjectivePlaneCurve{QQField})`

If the plane conic `D`

contains a rational point, return the homogeneous coordinates of such a point. If no such point exists, return a point on `D`

defined over a quadratic field extension of $\mathbb Q$.

**Examples**

```
julia> R, (x,y,z) = graded_polynomial_ring(QQ, ["x", "y", "z"]);
julia> C = ProjectivePlaneCurve(y^4-2*x^3*z+3*x^2*z^2-2*y^2*z^2)
Projective plane curve
defined by 0 = 2*x^3*z - 3*x^2*z^2 - y^4 + 2*y^2*z^2
julia> I = adjoint_ideal(C)
Ideal generated by
-x*z + y^2
x*y - y*z
x^2 - x*z
julia> R, (x,y,z) = graded_polynomial_ring(QQ, ["x", "y", "z"]);
julia> D = ProjectivePlaneCurve(x^2 + 2*y^2 + 5*z^2 - 4*x*y + 3*x*z + 17*y*z);
julia> P = rational_point_conic(D)
3-element Vector{AbstractAlgebra.Generic.MPoly{AbsSimpleNumFieldElem}}:
-1//4*a
-1//4*a + 1//4
0
julia> S = parent(P[1])
Multivariate polynomial ring in 3 variables x, y, z
over number field of degree 2 over QQ
julia> NF = base_ring(S)
Number field with defining polynomial t^2 - 2
over rational field
julia> a = gen(NF)
a
julia> minpoly(a)
t^2 - 2
```

## Parametrizing Rational Plane Curves

`parametrization`

— Method`parametrization(C::ProjectivePlaneCurve{QQField})`

Return a rational parametrization of `C`

.

**Examples**

```
julia> R, (x,y,z) = graded_polynomial_ring(QQ, ["x", "y", "z"]);
julia> C = ProjectivePlaneCurve(y^4-2*x^3*z+3*x^2*z^2-2*y^2*z^2)
Projective plane curve
defined by 0 = 2*x^3*z - 3*x^2*z^2 - y^4 + 2*y^2*z^2
julia> parametrization(C)
3-element Vector{QQMPolyRingElem}:
12*s^4 - 8*s^2*t^2 + t^4
-12*s^3*t + 2*s*t^3
8*s^4
```

## Contact

Please direct questions about this part of OSCAR to the following people:

You can ask questions in the OSCAR Slack.

Alternatively, you can raise an issue on github.