# Algebraic Curves

A general curve $C$ (type `Crv`) is defined by the vanishing of a finite number of polynomials $f_1,\ldots,f_n$ or a polynomial ideal $I$ in a general ambient space. As a scheme, this must have dimension $1$.

A plane curve $C$ (type `CrvPln`) is defined by the vanishing of a single polynomial $f$ in one of the available ambient planes:

$$
C\colon (f_1 = f_2 = \ldots = f_n = 0) \subset A.
$$

The polynomials or ideal must lie in the coordinate ring of $A$. The notation $C$ for a curve and $f$ or $f_1,\ldots,f_n$ for its defining equation(s) will be maintained. The coefficient ring of the parent of polynomials will be denoted $k$. Irrespective of type, the ambient space will be denoted $A$.

## Creation

In this section the most basic methods of creating a curve are presented. For specialised types — conics, elliptic curves, hyperelliptic curves — there are additional functions documented in the corresponding chapters. Curves may also be created implicitly, such as when they arise as the images of maps.

### `Curve(A, f): Sch, RngMPolElt -> CrvPln`

```magma
Nonsingular             : BoolElt                    Default: false
Reduced                 : BoolElt                    Default: false
Irreducible             : BoolElt                    Default: false
GeometricallyIrreducible: BoolElt                    Default: false
Saturated               : BoolElt                    Default: false
```

Create the plane curve $f=0$ in the ambient plane $A$ where $f$ is a polynomial in the coordinate ring of $A$.

### `Curve(A, I): Sch, RngMPol -> Crv`

```magma
Nonsingular             : BoolElt                    Default: false
Reduced                 : BoolElt                    Default: false
Irreducible             : BoolElt                    Default: false
GeometricallyIrreducible: BoolElt                    Default: false
Saturated               : BoolElt                    Default: false
```

Create the curve in the ambient space $A$ determined by the ideal $I$ of the coordinate ring of $A$. An error results if the result

### `Curve(X, S): Sch, SeqEnum -> Crv`

```magma
Nonsingular             : BoolElt                    Default: false
Reduced                 : BoolElt                    Default: false
Irreducible             : BoolElt                    Default: false
GeometricallyIrreducible: BoolElt                    Default: false
Saturated               : BoolElt                    Default: false
```

Create the curve defined by the sequence $S$ in the ambient space of $X$, where $S$ is a sequence of polynomials in the coordinate ring. Here $X$ can be any scheme, not necessarily an ambient space itelf. An error results if the result is not actually a 1-dimensional scheme.

Note: An important special case is when $A$ is an affine or a projective space of dimension 1 and $S$ is empty. This gives the affine or projective line as a curve - as a scheme it is just the ambient space $A$. Alternatively, the constructor `Curve(A)` described below may be used. Note that the initial construction of $A$ never returns it as a `Crv` type, even though it is 1-dimensional. This is for internal technical reasons – a `Crv` cannot be considered as an ambient space by Magma. is not a $1$-dimensional scheme.

### `IsCurve(X): Sch -> BoolElt, Crv`

Returns `true` if and only if $X$ is a one-dimensional scheme.

### `Curve(X): Sch -> Crv`

The smallest scheme in the inclusion chain above the scheme $X$ which is a curve. If $X$ is a curve (ie 1-dimensional) then $X$ will be returned as a `Crv` type. If $X$ has been created as a subscheme of a curve then this curve will be returned.

### `Line(C, p, q): CrvPln, Pt, Pt -> CrvPln`

### `Line(P, S): Prj, \{Pt\} -> Sch`

The line through the distinct points $p$, $q$ on the curve $C$, or the points of $S$ as a subscheme of the projective space $P$ if they are collinear. If the points are points of a curve rather than the ambient space, the line will be interpreted as the tangent line in the case that the points are equal.

### `Conic(P, S): Prj, \{Pt\} -> Crv`

Given a projective plane $P$ and a set $S$ of points in $P$, this function returns the conic $P$ through the points of the set $S$ if such a conic exists and is unique. The traditional setup corresponds to the case where $S$ is a set of $5$ points in general position, that is, no three of them are collinear. If the resulting conic curve is nonsingular, then it will be returned as a special type. See Chapter [Rational Curves and Conics](../../ArithmeticGeometry/RationalCurvesAndConics/index-rational-curves-and-conics.md#chapcrvcon) for details of the special functions that apply in that case.

### `Union(C, D): Sch, Sch -> Sch`

Create the union of the curves $C$ and $D$. The result will usually be non-irreducible, so although it will be interpreted as a curve, most of the advanced functions below will not apply to it.

## Base Change

Let $A$ be some ambient space in Magma. For example, think of $A$ as being the affine plane. Let $k$ be its base ring and $R_A$ its coordinate ring. If $m\colon k\rightarrow L$ is a map of rings (a coercion map, for instance) then there is a new ambient space denoted $A_L$ and called the *base change of* $A$ *to* $L$ which has coordinate ring $R_A$ but with coefficients $L$ instead of $k$. (Mathematically, one simply tensors $R_A$ with $L$ over $k$. In Magma the equivalent function at the level of polynomial rings is `ChangeRing`.) There is a base change function described below which takes $A$ and $L$ (or the map $k\rightarrow L$) as arguments and creates this new space $A_L$. Note that there is a map from the coordinate ring of $A$ to that of $A_L$ determined by the map $m$.

This operation is called *base extension* since one often thinks of the map $m$ as being an extension of fields. Of course, the map $m$ could be many other things. One key example where the name *extension* is a little unusual would be when $m$ is the map from the integers to some finite field.

Now let $X$ be a scheme in Magma. Thus $X$ is defined by some polynomials $f_1,\dots, f_r$ on some ambient space $A$. Given a ring map $k\rightarrow L$ there is a base change operation for $X$ which returns the *base change of* $X$ *to* $L$, denoted $X_L$. This is done by first making the base change of $A$ to $L$ and then using the map from the coordinate ring of $A$ to that of $A_L$ to translate the polynomials $f_i$ into polynomials defined on $A_L$. These polynomials can then be used to define a scheme in $A_L$. It is this resulting scheme which is the base change of $X$ to $L$.

If one has a number of curves in the same ambient space and wants to base change them all at the same time, a little care is required. The function which takes a curve and a map of rings as argument will create a new ambient space each time so should be avoided. A better approach is to apply base change to the ambient space and then invoke the base change function which takes the curve and the desired new ambient space as argument. (This latter base change function appears to be different to the other. In fact it is not. We described base change above as a function of maps of rings. Of course, there is a natural extension to maps of schemes. With that extension, this final base change intrinsic really is base change with respect to map of ambient spaces.)

### `BaseChange(C, K): Sch, Rng -> Sch`

The base change of the curve $C$ to the new base ring $K$. This is only possible if elements of the current base ring of $C$ can be coerced automatically into $K$. The resulting curve will lie in a newly created plane (see the example below).

### `BaseChange(C, m): Sch, Map -> Sch`

The base change of the curve $C$ by the map of base rings $m$. The resulting curve will lie in a newly created plane.

### `BaseChange(C, A): Sch, Sch -> Sch`

### `BaseChange(C, A, m): Sch, Sch, Map -> Sch`

The base change of the curve $C$ to a curve in the new ambient space $A$. The space $A$ must be of the same type as the ambient of $C$ and its base ring must either admit coercion from the base ring of $C$ or have the map $m$ between the two explicitly given.

### `BaseChange(C, n): Sch, RngIntElt -> Sch`

The base change of $C$, where the base ring of $C$ is a finite field to the finite field which is a degree $n$ extension of the base field of $C$.

### `Example: Curve Base Change (ex-d5a0e9)`

We give an example of a singular curve, over the rationals, whose singular points are only defined over the field extension given by adjoining a square root of $-1$.

```magma
> A<x,y> := AffineSpace(Rationals(),2);
> C := Curve(A,y^2 - (x^2+1)^3);
> SingularPoints(C);
{}
> HasSingularPointsOverExtension(C);
true

```

Here we assume that the user knows which extension to move to. The first method of finding the points is to search in the particular point set as follows.

```magma
> Qi<i> := QuadraticField(-1);
> SingularPoints(C,Qi);
{ (i, 0), (-i, 0) }

```

The second method is to create a new curve by base change and to search the base ring point set for that curve. For a single calculation this method is rather clumsy, but if further computation were to take place at these points it might be preferable.

```magma
> B<u,v> := BaseChange(A,Qi);
> Ci := BaseChange(C,B);
> SingularPoints(Ci);
{ (i, 0), (-i, 0) }

```

## Basic Attributes

The first few functions below recover data from the ambient space of the curve (and could equally well be applied to the ambient space). Any curves lying in the same ambient space will return identical results when evaluated in these functions. The remaining functions recover data about the equation defining the curve.

The coordinate ring of a curve is described here, but its function field is discussed much later in Section [Function Fields](function_field.md#crv-fldfun).

### `AmbientSpace(C): Sch -> Sch`

The ambient space containing the curve $C$.

### `BaseRing(C): Sch -> Rng`

### `CoefficientRing(C): Sch -> Rng`

### `BaseField(C): Sch -> Fld`

The base ring of the curve $C$. This is recovered as the base ring of the ambient plane. The third function will report an error if the base ring is not a field.

### `DefiningPolynomial(C): Sch -> RngMPolElt`

The defining polynomial of the plane curve $C$.

### `DefiningIdeal(C): Sch -> RngMPol`

The defining ideal of the curve $C$, as an ideal in the coordinate ring of its ambient space.

### `CoordinateRing(C): Sch -> Rng`

The coordinate ring of the curve $C$. Even creating this requires the use of Gröbner basis techniques.

### `Degree(C): Sch -> RngIntElt`

The degree of the of the curve $C$ which must be defined in an ordinary projective ambient space.

### `JacobianIdeal(C): Sch -> RngMPol`

The ideal of partial derivatives of the defining polynomials of the curve $C$.

### `JacobianMatrix(C): Sch -> ModMatRngElt`

The matrix of partial derivatives of the defining polynomials of the curve $C$.

### `HessianMatrix(C): Sch -> Mtrx`

The symmetric matrix of second partial derivatives of the defining polynomial of the plane curve $C$.

### `Example: Curve Hessian (ex-2ecc15)`

In this example we start by creating a plane curve $C$ and check that its ideal really is principal. We have chosen an example which is in Weierstrass form.

```magma
> A<x,y,z> := ProjectiveSpace(Rationals(),2);
> C := Curve(A,z*y^2 - x^3 - x*z^2 - z^3);
> IsNonsingular(C);
true
> DefiningIdeal(C);
Ideal of Polynomial ring of rank 3 over Rational Field
Lexicographical Order
Variables: x, y, z
Basis:
[
    -x^3 - x*z^2 + y^2*z - z^3
]
> IsPrincipal($1);
true x^3 + x*z^2 - y^2*z + z^3

```

Next we compute the determinant of the Hessian matrix of $C$. That is a polynomial which we use to create another curve $D$. The intersection of $C$ and $D$ are the points of inflection, or *flexes*, of $C$. Over an algebraic closure there will be nine of these, but we only see one — the family “flex at infinity” — over the rationals.

```magma
> M := HessianMatrix(C);
> Determinant(M);
24*x^2*z + 24*x*y^2 + 72*x*z^2 - 8*z^3
> D := Curve(A,Determinant(M));
> IntersectionPoints(C,D);
{ (0 : 1 : 0) }

```

## Basic Invariants

### `IsReduced(C): Sch -> BoolElt`

Returns `true` if and only if the ideal defining the curve $C$ is reduced.

### `IsIrreducible(C): Sch -> BoolElt`

Returns `true` if and only if the curve $C$ is irreducible (as a scheme).

### `IsSingular(C): Sch -> BoolElt`

Returns `true` if and only if the curve $C$ contains at least one singularity over an algebraic closure of its base field.

### `IsNonsingular(C): Sch -> BoolElt`

Returns `true` if and only if the curve $C$ has no singularities over an algebraic closure of its base field.

## Random Curves

This section described several functions for the generation of random curves of given degree and/or genus over finite fields and the rationals. The implementations follow [[Schreyer and Tonoli, 2002](../../references.md#cite-schreyer-tonoli)].

### `RandomNodalCurve(d, g, P): RngIntElt, RngIntElt, Prj -> CrvPln`

```magma
RandomBound: RngIntElt                    Default: 9
```

Generates a random plane curve in the projective plane $P$ of degree $d$ and genus $g$ with only nodes as singularities. The genus $g$ must satisfy $g \le (d-1)(d-2)/2$ and then the number of nodes will be $(d-1)(d-2)/2 - g$. These nodes are chosen as a random set of points in $P$. At the same time $g$ must be $\ge 1+(d(d-6)/3)$ to guarantee a non-empty linear system for a general set of nodes. For $0 \le g \le 10$, a good choice to obtain a general curve of genus $g$ is to take $d = g+2-[g/3]$ (see [[Schreyer and Tonoli, 2002](../../references.md#cite-schreyer-tonoli)]).

The base field may be a finite field or ${\mathbb{Q}}$. Over ${\mathbb{Q}}$, the construction uses polynomials which will have integer coefficients randomly chosen in the range $[-r \ldots r]$, where $r$ is the value of `RandomBound`. Over a finite field, `RandomBound` is ignored.

### `IsNodalCurve(C): Crv -> BoolElt`

Given a plane curve $C$, this function returns `true` if either $C$ is non-singular or $C$ only has nodes as singularities.

### `RandomOrdinaryPlaneCurve(d, S, P): RngIntElt, SeqEnum, Prj -> CrvPln, RngMPol`

```magma
Adjoint    : BoolElt                      Default: true
Proof      : BoolElt                      Default: true
RandomBound: RngIntElt                    Default: 9
```

Generates a random plane curve in the projective plane $P$ of degree $d$ and with ordinary singularities specified by the sequence $sings$ as follows: If $S = [s_2,s_3,s_4, \ldots]$ then the curve will have $s_2$ nodes, $s_3$ triple points, $s_4$ ordinary singularities of multiplicity 4, etc. For example $[2,0,1]$ specifies 2 nodes and one ordinary quadruple point.

For such a curve to exist we require ${d-1 \choose 2} \ge \sum_i s_i {i+1 \choose 2}$.

If `Proof` is `false` then the full check that the singularities are ordinary is skipped.

If `Adjoint` is `true` then the adjoint ideal, an ideal of the coordinate ring of $P$, is also computed and returned as a second value. The r-th graded parts of this homogeneous ideal realises the linear system $K+(r-d+3)H$ on the normalisation of the curve, where $K$ is the canonical divisor and $H$ is the hyperplane section divisor corresponding to the (singular) embedding into $P$. This can be used to compute various adjoint maps (for example, $r = d-3$ gives the canonical map) and its computation by this function is more efficient than using the general method of blowing-up in `Adjoints` (this function now also tests for ordinariness and uses the adjoint ideal by default).

The base field can be finite or ${\mathbb{Q}}$ and `RandomBound` is as before.

### `RandomCurveByGenus(g, K): RngIntElt, Fld -> Crv`

```magma
RandomBound: RngIntElt                    Default: 9
```

Given a positive integer $g$ and a field $K$ this function generates a random projective curve over $K$ of genus $g$, for $0 \le g \le 13$. When $g \le 10$, a plane nodal curve is returned as given by the function `RandomNodalCurve` with degree $g+2-[g/3]$. For $11 \le g \le 13$, a curve in ${\bf P}^3$ is returned, computed by syzygy computations as described in [[Schreyer and Tonoli, 2002](../../references.md#cite-schreyer-tonoli)].

The field $K$ must be a finite field or ${\mathbb{Q}}$. The parameter `RandomBound` applies when $K$ is chosen to be ${\mathbb{Q}}$. Note that, although ${\mathbb{Q}}$ is allowed in all cases, for the higher values of $g$, particularly for $g \ge 11$, the heights of the coefficients of the defining polynomials for the curve produced tend to be very large, even for small values of `RandomBound`.

### `Example: Random Curves (ex-4c97b4)`

```magma
> SetSeed(1);
> C := RandomCurveByGenus(4, Rationals());
> C;
Curve over Rational Field defined by
x^5 + 34965/512*x*y*z^3 - 59355/512*x*z^4 + y^5 - 16705/48*y^3*z^2 -
    1831885/1536*y^2*z^3 - 1553135/2304*y*z^4 + 655145/4608*z^5
> Genus(C);
4
> C := RandomCurveByGenus(8, GF(23));
> C;
Curve over GF(23) defined by
17*x^8 + 5*x^7*y + 5*x^7*z + 13*x^6*y^2 + 11*x^6*y*z + 8*x^6*z^2 + 16*x^5*y^3 +
    17*x^5*y^2*z + 22*x^5*y*z^2 + 6*x^5*z^3 + 3*x^4*y^4 + 2*x^4*y^3*z +
    18*x^4*y^2*z^2 + 3*x^4*y*z^3 + 14*x^4*z^4 + 19*x^3*y^5 + 19*x^3*y^4*z +
    19*x^3*y^3*z^2 + 21*x^3*y^2*z^3 + 21*x^3*y*z^4 + 10*x^3*z^5 + 18*x^2*y^6 +
    4*x^2*y^5*z + 9*x^2*y^4*z^2 + 2*x^2*y^3*z^3 + 21*x^2*y^2*z^4 + 22*x^2*y*z^5
    + 6*x^2*z^6 + 14*x*y^7 + 4*x*y^6*z + 17*x*y^5*z^2 + 20*x*y^4*z^3 +
    14*x*y^2*z^5 + 15*x*y*z^6 + 3*x*z^7 + 18*y^8 + 2*y^7*z + 11*y^6*z^2 +
    18*y^4*z^4 + 18*y^3*z^5 + 5*y^2*z^6 + 22*y*z^7 + 2*z^8
> Genus(C);
8
> C := RandomCurveByGenus(12, GF(23));
> Ambient(C);
Projective Space of dimension 3
Variables : x, y, z, t
> Degree(C); Genus(C);
12
12

```

## Ordinary Plane Curves

The term ordinary plane curve refers to a curve in the projective plane all of whose singularities are ordinary. This means that a singularity of multiplicity $m \ge 2$ has $m$ “distinct tangent directions” – the equation of the curve expanded in local coordinates at the singularity begins with a binary form of degree $m$ which splits into $m$ distinct linear factors over the algebraic closure of the ground field.

A significant property of such curves is that all of their singularities are resolved by a single blow-up. Their adjoint linear systems/adjoint ideal can be computed in a more direct fashion than for more general plane curves. These linear systems give important projective maps such as the canonical map for curves of genus at least $2$ and embeddings as rational normal curves for curves of genus $0$.

This section contains some functions relating to ordinary curves and, in particular, to nodal curves, all of whose singularities are ordinary of multiplicity 2 (nodes). The list of functions is likely to be extended in future versions of Magma.

### `HasOnlyOrdinarySingularities(C): CrvPln -> BoolElt, RngIntElt, RngMPol`

```magma
Adjoint: BoolElt                    Default: true
```

Given a plane curve $C$ this function returns `true` in $C$ has only ordinary singularities. If that is the case it also returns the maximum of the multiplicities of the singularities of $C$ (1 means that $C$ is non-singular). Further, if $C$ is ordinary and if `Adjoint` is `true`, then the (saturated) adjoint ideal is also computed and returned as the third value.

### `HasOnlyOrdinarySingularitiesMonteCarlo(C): CrvPln -> BoolElt, RngIntElt`

Given a plane curve $C$ defined over ${\mathbb{Q}}$ perform a Monte Carlo test for ordinariness. This will generally be faster than the intrinsic `OnlyOrdinarySingularities`. The function does not compute the adjoint ideal. Five primes are chosen for which the mod $p$ reduction of $C$ is still a curve and which has Jacobian ideal of the same degree as that of $C$. The five reductions are tested for ordinary singularities. If all pass, then `true` is returned. Otherwise `false` is returned. If `false` is returned, then $C$ is definitely not ordinary. If it succeeds, then $C$ is very likely to be ordinary but this is not 100% guaranteed.

### `AdjointIdeal(C): Crv -> RngMPol`

Returns the (saturated) adjoint ideal of an ordinary plane curve $C$. If $C$ is not ordinary then an error results.

### `AdjointIdealForNodalCurve(C): Crv -> RngMPol`

### `AdjointLinearSystemForNodalCurve(C, d): Crv, RngIntElt -> LinearSys`

Given a plane curve $C$ that is *assumed* to be nodal, these are slightly faster intrinsics for computing the adjoint ideal and adjoint linear system, respectively. The first function returns the adjoint ideal $I$ and the second returns the degree $d$ adjoint linear system, which is the linear subsystem of the complete plane linear system of degree $d$ given by the degree $d$ graded part of $I$.

### `AdjointLinearSystemFromIdeal(I, d): RngMPol, RngIntElt -> LinearSys`

Given an ideal $I$ and a positive integer $d$, this function returns the degree $d$ adjoint linear system for a plane curve whose (saturated) adjoint ideal is $I$.

### `CanonicalLinearSystemFromIdeal(I, d): RngMPol, RngIntElt -> LinearSys`

Given an ideal $I$ and a positive integer $d$, this function returns the canonical linear system for a plane curve of degree $d$ whose (saturated) adjoint ideal is $I$. This is the same as intrinsic `AdjointLinearSystemFromIdeal` with $I$ and $d-3$ as arguments. It will be empty if the curve has genus 0.

### `CanonicalLinearSystem(C): Crv -> LinearSys`

### `AdjointLinearSystem(C): Crv -> LinearSys`

### `Adjoints(C, d): Crv, RngIntElt -> LinearSys`

Given a plane curve $C$ the first two functions return the canonical linear system for any plane curve $C$ and the third gives the general degree $d$ adjoint linear system. If $C$ is ordinary, then the functions compute the adjoint ideal and takes its graded piece as above. If not, they have to work out in detail the graph of the full resolution of singularities of $C$, which can take some time.

### `Example: Ordinary Curves (ex-d7505d)`

In this example, we generate a random ordinary plane curve of degree 7 with 3 nodes and one ordinary singularity of order 4. We use its adjoint ideal to get the canonical map and compute its canonical image in ${\bf P}^5$. The computation of the canonical map this way is generally faster and gives a much simpler map description than the computation for general curves using the function field machinery.

```magma
> P<x,y,z> := ProjectiveSpace(Rationals(),2);
> C, I := RandomPlaneCurve(7,[3,0,1],P : RandomBound := 2);
> C;
Curve over Rational Field defined by
x^7 + x^5*y*z + x^4*y^3 + x^3*y^2*z^2 - 708*x^3*z^4 - 3401/18*x^2*y^2*z^3 +
    3274/9*x^2*y*z^4 + 29054/9*x^2*z^5 - 5861/15552*x*y^6 - 5279/432*x*y^5*z -
    71851/1296*x*y^4*z^2 + 173479/486*x*y^3*z^3 + 87337/108*x*y^2*z^4 -
    294685/81*x*y*z^5 - 662891/243*x*z^6 + 8117/15552*y^7 + 5543/972*y^6*z +
    41419/1296*y^5*z^2 - 17087/243*y^4*z^3 - 646577/972*y^3*z^4 +
    77026/81*y^2*z^5 + 423635/243*y*z^6 + 156920/243*z^7
> Genus(C);
6
> //check with OnlyOrdinarySingularities function
> boo,d,I1 := HasOnlyOrdinarySingularities(C);
> boo; d;
true
4
> I eq I1;
true
> // polynomials for canonical map come from the degree d-3=4
> // graded piece of the adjoint ideal.
> can_pols := AdjointLinearSystemFromIdeal(I, 4);
> Sections(can_pols);
[
    x^4 - 24*x^2*z^2 - 83/36*x*y^2*z + 83/9*x*y*z^2 + 493/9*x*z^3 - 167/432*y^4
        + 145/108*y^3*z + 35/6*y^2*z^2 - 731/27*y*z^3 - 587/27*z^4,
    x^3*y - 12*x^2*z^2 - 73/18*x*y^2*z + 38/9*x*y*z^2 + 286/9*x*z^3 - 55/216*y^4
        + 65/54*y^3*z + 7*y^2*z^2 - 494/27*y*z^3 - 350/27*z^4,
    x^3*z - 6*x^2*z^2 - 5/18*x*y^2*z + 10/9*x*y*z^2 + 98/9*x*z^3 - 7/108*y^4 +
        5/27*y^3*z + y^2*z^2 - 112/27*y*z^3 - 112/27*z^4,
    x^2*y^2 - 4*x^2*z^2 - 11/3*x*y^2*z - 4/3*x*y*z^2 + 52/3*x*z^3 - 5/36*y^4 -
        5/9*y^3*z + 10*y^2*z^2 - 116/9*y*z^3 - 68/9*z^4,
    x^2*y*z - 2*x^2*z^2 - 2/3*x*y^2*z - 4/3*x*y*z^2 + 16/3*x*z^3 - 1/18*y^4 +
        5/18*y^3*z + y^2*z^2 - 14/9*y*z^3 - 20/9*z^4,
    x*y^3 - 12*x*y*z^2 + 16*x*z^3 - 1/2*y^4 - 2*y^3*z + 12*y^2*z^2 - 8*y*z^3 -
        8*z^4
]
> X := CanonicalImage(C, Sections(can_pols));
> X;
Curve over Rational Field defined by
x[1]*x[4] - x[2]^2 + 5/36*x[2]*x[6] + 4*x[3]^2 + 11/3*x[3]*x[4] - 68/3*x[3]*x[5]
    - 68/9*x[3]*x[6] - 95/216*x[4]*x[6] + 140/3*x[5]^2 + 2*x[5]*x[6] +
    131/324*x[6]^2,
x[1]*x[5] - x[2]*x[3] + 1/18*x[2]*x[6] + 2*x[3]^2 + 2/3*x[3]*x[4] -
    14/3*x[3]*x[5] - 5/9*x[3]*x[6] - 1/27*x[4]*x[6] + 7/6*x[5]^2 +
    1/24*x[5]*x[6] + 2/81*x[6]^2,
-x[1]*x[6] + x[2]*x[4] - 1/2*x[2]*x[6] - 8*x[3]*x[5] + 5/3*x[3]*x[6] -
    1/9*x[4]*x[6] + 14*x[5]^2 + 4*x[5]*x[6] + 43/216*x[6]^2,
x[2]*x[5] - x[3]*x[4] + 2*x[3]*x[5] + 2/3*x[3]*x[6] + 1/18*x[4]*x[6] - 7*x[5]^2
    - 1/4*x[5]*x[6] - 1/27*x[6]^2,
-x[2]*x[6] + x[4]^2 - 1/2*x[4]*x[6] - 4*x[5]^2 + 16/3*x[5]*x[6] + 1/36*x[6]^2,
-x[3]*x[6] + x[4]*x[5] + 2*x[5]^2 + 1/6*x[5]*x[6] + 1/18*x[6]^2,
x[1]^3 - 10*x[1]^2*x[3] + x[1]*x[2]*x[3] + 52*x[1]*x[3]^2 + 95/216*x[2]^3 +
    15/2*x[2]^2*x[3] + 337/432*x[2]^2*x[4] - 491/18*x[2]*x[3]^2 -
    425/36*x[2]*x[3]*x[4] - 71/1296*x[2]*x[4]^2 + 676/27*x[3]^3 +
    3907/108*x[3]^2*x[4] - 506/27*x[3]^2*x[5] + 341/36*x[3]*x[4]^2 -
    529/36*x[3]*x[4]*x[5] + 2525/162*x[3]*x[5]^2 - 103/15552*x[4]^3 -
    18385/1944*x[4]^2*x[5] + 4751/11664*x[4]^2*x[6] - 44317/1296*x[4]*x[5]^2 +
    317441/46656*x[4]*x[5]*x[6] - 3677/139968*x[4]*x[6]^2 - 11905/162*x[5]^3 -
    52453/11664*x[5]^2*x[6] - 1113761/279936*x[5]*x[6]^2 +
    813889/1679616*x[6]^3,
x[1]^2*x[2] - 2*x[1]^2*x[3] - 8*x[1]*x[2]*x[3] + 16*x[1]*x[3]^2 - 31/36*x[2]^3 +
    29/3*x[2]^2*x[3] + 113/72*x[2]^2*x[4] + 29/3*x[2]*x[3]^2 -
    5/9*x[2]*x[3]*x[4] + 5/54*x[2]*x[4]^2 - 460/9*x[3]^3 - 577/18*x[3]^2*x[4] +
    1688/9*x[3]^2*x[5] - 1391/108*x[3]*x[4]^2 + 2257/18*x[3]*x[4]*x[5] -
    1717/9*x[3]*x[5]^2 - 437/648*x[4]^3 + 15593/648*x[4]^2*x[5] +
    13321/15552*x[4]^2*x[6] - 10073/108*x[4]*x[5]^2 - 93221/7776*x[4]*x[5]*x[6]
    + 93403/93312*x[4]*x[6]^2 + 1582/9*x[5]^3 - 11059/1296*x[5]^2*x[6] -
    193157/46656*x[5]*x[6]^2 + 363041/559872*x[6]^3,
x[1]*x[2]^2 - 4*x[1]*x[2]*x[3] + 4*x[1]*x[3]^2 - 7/6*x[2]^3 + x[2]^2*x[3] +
    1/2*x[2]^2*x[4] + 10*x[2]*x[3]^2 + 26/3*x[2]*x[3]*x[4] + 10/9*x[2]*x[4]^2 -
    44/3*x[3]^3 - 36*x[3]^2*x[4] + 200/3*x[3]^2*x[5] - 301/18*x[3]*x[4]^2 +
    331/3*x[3]*x[4]*x[5] - 538/3*x[3]*x[5]^2 - 83/54*x[4]^3 +
    1109/54*x[4]^2*x[5] + 13/8*x[4]^2*x[6] - 1117/12*x[4]*x[5]^2 -
    4051/648*x[4]*x[5]*x[6] - 25/1296*x[4]*x[6]^2 + 2236/9*x[5]^3 +
    14917/648*x[5]^2*x[6] - 1351/162*x[5]*x[6]^2 + 45109/46656*x[6]^3

```
