Algebraic Curves

A general curve C (type Crv) is defined by the vanishing of a finite number of polynomials f1, ..., fn 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: (f1 = f2 = ... = fn = 0) ⊂A.

The polynomials or ideal must lie in the coordinate ring of A. The notation C for a curve and f or f1, ..., fn 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.

Contents

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
    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
    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
    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 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 RA its coordinate ring. If m: k -> L is a map of rings (a coercion map, for instance) then there is a new ambient space denoted AL and called the base change of A to L which has coordinate ring RA but with coefficients L instead of k. (Mathematically, one simply tensors RA 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 -> L) as arguments and creates this new space AL. Note that there is a map from the coordinate ring of A to that of AL 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 f1, ..., fr on some ambient space A. Given a ring map k -> L there is a base change operation for X which returns the base change of X to L, denoted XL. 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 AL to translate the polynomials fi into polynomials defined on AL. These polynomials can then be used to define a scheme in AL. 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 Crv_curve-base-change (H121E2)

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.
> 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.

> 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.
> 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.

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 Crv_curve-hessian (H121E3)

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.
> 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.
> 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 [ST02].

RandomNodalCurve(d, g, P) : RngIntElt, RngIntElt, Prj -> CrvPln
    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 ≤(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 ≥1 + (d(d - 6)/3) to guarantee a non-empty linear system for a general set of nodes. For 0 ≤g ≤10, a good choice to obtain a general curve of genus g is to take d = g + 2 - [g/3] (see [ST02]).

The base field may be a finite field or Q. Over Q, the construction uses polynomials which will have integer coefficients randomly chosen in the range [ - r ... 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
    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 = [s2, s3, s4, ... ] then the curve will have s2 nodes, s3 triple points, s4 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) ≥∑i si (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 Q and RandomBound is as before.

RandomCurveByGenus(g, K) : RngIntElt, Fld -> Crv
    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 ≤g ≤13. When g ≤10, a plane nodal curve is returned as given by the function RandomNodalCurve with degree g + 2 - [g/3]. For 11 ≤g ≤13, a curve in P3 is returned, computed by syzygy computations as described in [ST02].

The field K must be a finite field or Q. The parameter RandomBound applies when K is chosen to be Q. Note that, although Q is allowed in all cases, for the higher values of g, particularly for g ≥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 Crv_random-curves (H121E4)

> 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 ≥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
    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 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 Crv_ordinary-curves (H121E5)

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 P5. 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.
> 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
V2.28, 13 July 2023