Global Geometry

In this section functions which determine global properties of curves such as their genus and whether their equation has a particular form are presented.

Contents

Genus and Singularities

Genus(C) : Crv -> RngIntElt
GeometricGenus(C) : Crv -> RngIntElt
The topological genus of the curve C. More precisely, this is the arithmetic genus of the projective normalisation tilde(C), which is unique up to k-isomorphism, where k is the basefield of C. C must be an integral curve (reduced and irreducible as a scheme).

Note that, if k is not a perfect field, tilde(C) may have singularities over an inseparable extension field of k (in technical terms, tilde(C) is a non-singular scheme, but it may not be k-smooth), in which case the genus of C may drop after some (inseparable) basefield extensions.

GenusViaArithmeticGenus(C) : Crv -> RngIntElt
An alternative method for computation of the genus of C, which should be a projective curve. The method is to compute the (much easier) arithmetic genus of C and then to subtract off the "delta adjustments" over the set of singular points of C, which are computed with the DeltaAdjustment intrinsic. Requires that C is projective and lies in an ambient where its singular subscheme is computable.
ArithmeticGenus(C) : Crv -> RngIntElt
The arithmetic genus of the curve C or its projective closure if C is affine. In the case of a plane projective curve of degree d, this number is just (d - 1)(d - 2)/2.

This is really the arithmetic genus of (projective) scheme C and not of its normalisation.

NumberOfPunctures(C): CrvPln -> RngIntElt
The number of punctures of the affine plane curve C over an algebraic closure of its ground field, that is, the number of points supporting its reduced scheme at infinity. This is just the reduced degree of the polynomial of C at infinity.
SingularPoints(C) : Sch -> SetIndx
The singular points of the curve C which are defined over the base field of C.
HasSingularPointsOverExtension(C) : Sch -> BoolElt
Returns false if and only if the scheme of singularities of the curve C has support defined over the base field of C. This function requires that C be reduced.
Flexes(C) : Sch -> Sch
InflectionPoints(C) : Sch -> Sch
For a plane curve C, this returns the subscheme of C defined by the vanishing of the determinant of the Hessian matrix. This contains the "flex points" of C, which by definition are the nonsingular points at which the tangent line intersects C with multiplicity at least 3.
C eq D : Sch,Sch -> BoolElt
Returns true if and only if the curves C and D are defined by identical ideals in the same ambient space. (For plane curves, this simply compares defining polynomials of the two curves up to a factor so Gröbner basis calculations are avoided.)

IsSubscheme(C,D) : Sch,Sch -> BoolElt
Returns true if and only if the curve C is contained (scheme-theoretically) in the curve D.

Example Crv_crv-genus (H121E12)

We take a plane affine cubic C with a single cusp and non-singular at infinity. Here the projective normalisation of C is isomorphic to the projective line with genus 0, although the arithmetic genus of C is 1.
> A<x,y> := AffineSpace(GF(3),2);
> C := Curve(A,y^2 - x^3 - 1);
> Genus(C);
0
> ArithmeticGenus(C);
1
Now we consider a similar cubic over the non-perfect field K=k(t) with a single cuspidal singularity defined over an inseparable cubic extension. Now C is a normal and non-singular scheme (but non-smooth), which only loses its normality after an inseparable basefield extension. Here both the genus and arithmetic genus are 1.
> K<t> := RationalFunctionField(GF(3));
> A<x,y> := AffineSpace(K,2);
> C := Curve(A,y^2 - x^3 - t);
> Genus(C);
1

Projective Closure and Affine Patches

In Magma, any affine space has a unique projective closure. This may be assigned different variable names just like any projective space. The projective closure functions applied to affine curves will return projective curves in the projective closure of the affine ambient. Conversely, a projective space has standard affine patches. These will also appear as the ambient spaces of the standard affine patches of a projective curve.

ProjectiveClosure(A): Sch -> Sch
The projective space that is the projective closure of the ambient A. Unless A is already expressed as a particular patch on some projective space, this is the standard closure defined by the homogenisation of the coordinate ring of A with a new coordinate and unit weights.
ProjectiveClosure(C) : Sch -> Sch
The closure of the curve C in the projective closure of its ambient affine space.

Example Crv_proj-cl-commutes (H121E13)

Since the closure of the ambient space is unique, the ambient space of the closure of curves lying in a common affine space is independent of how it is constructed. Here is an odd example but one that occurs in practice when curves and spaces are passed between functions: the functions ProjectiveClosure() and AmbientSpace() commute!
> A<a,b> := AffineSpace(GF(5),2);
> C := Curve(A,a^3 - b^4);
> AmbientSpace(ProjectiveClosure(C)) eq ProjectiveClosure(AmbientSpace(C));
true
LineAtInfinity(A) : Aff -> CrvPln
The line which is the complement of the affine plane A embedded in the projective closure of A.
PointsAtInfinity(C) : Crv -> SetEnum
The set of points at infinity defined over the base field of the curve C. The number of these points can also be recovered by the NumberOfPunctures() function in the plane case.
AffinePatch(C,i) : Crv,RngIntElt -> SeqEnum
The i-th affine patch of the projective curve C. For ordinary projective space, the first patch is the one centred on the point (0:0: ... :0:1), the second at the point (0:0: ... :1:0) and so on.

Example Crv_second-affine-patch (H121E14)

Usually one looks at the first affine patch of a curve. If the curve is described, as below, using homogeneous coordinates x,y,z then this is often realised by "setting z=1". Note that we have to assign names to the coordinates explicitly on the affine patches if we want them.
> P<x,y,z> := ProjectiveSpace(GF(11),2);
> C := Curve(P,x^3*z^2 - y^5);
> AffinePatch(C,1);
Curve over GF(11) defined by 10*$.1^3 + $.2^5
> C1<u,v> := AffinePatch(C,1);
> C1;
Curve over GF(11) defined by 10*u^3 + v^5
> SingularPoints(C);
{ (1 : 0 : 0), (0 : 0 : 1) }
One can also look at other patches. Indeed, sometimes it is necessary. In this example, the curve C has an interesting singularity "at infinity", the point (1 : 0 : 0). If we want to view it on an affine curve then we must take one of the other patches.
> C3<Y,Z> := AffinePatch(C,3);
> C3;
Curve over GF(11) defined by Y^5 + 10*Z^2
> IsSingular(C3 ! [0,0]);
true
Both affine curves C1 and C3 have the projective curve C as their projective closure.
> ProjectiveClosure(C1) eq ProjectiveClosure(C3);
true

Special Forms of Curves

The functions in this section check whether a curve is written in a particular normal form, and also whether it belongs to one of the more specialised families of curve.

IsEllipticWeierstrass(C) : Crv -> BoolElt
Returns true if the curve C is nonsingular plane curve of genus 1 in Weierstrass form. This tests the coefficients of the polynomial of C. The conditions guarantee a flex at the point (0:1:0) either on C or on its projective closure. These are precisely the conditions required by the linear equivalence algorithms for divisors in a later section.

IsHyperellipticWeierstrass(C) : Crv -> BoolElt
Returns true if the curve C is a hyperelliptic curve in plane Weierstrass form. The conditions chosen are that the (a) first affine patch be nonsingular, (b) the point (0:1:0) is the only point at infinity and has tangent cone supported at the line at infinity and (c), the projection of C away from that point has degree 2.

EllipticCurve(C) : Crv -> CrvEll, MapSch
EllipticCurve(C,p) : Crv, Pt -> CrvEll, MapSch
EllipticCurve(C,p) : Crv, PlcCrvElt -> CrvEll, MapSch
See the description of EllipticCurve in Chapter ELLIPTIC CURVES.

IsHyperelliptic(C) : Crv -> BoolElt, CrvHyp, MapSch
    Eqn: BoolElt                        Default: true
IsGeometricallyHyperelliptic(C) : Crv -> BoolElt, Crv, MapSch
    Map: BoolElt                        Default: true
    SetVerbose("IsHyp", n):             Maximum: 2
The second function determines whether the curve C is a hyperelliptic curve over the algebraic closure of its base field. If so and if Map is true, a plane conic or the projective line and a degree 2 map from C to it (all defined over the base field) are returned. The map is to the line if the genus of C is even and to a conic if the genus is odd.

The first function determines whether the curve C is hyperelliptic over its base field K (ie has a degree 2 map to the projective line defined over K). If so, and if the Eqn parameter is true, it also returns a hyperelliptic Weierstrass model H over K and an isomorphic scheme map from C to H.

Here, hyperelliptic entails genus ≥2.

The basic method in both cases is to find the image of C under the canonical map (using functions to be described later) and to check if this is of arithmetic genus zero. If so, this image curve (which is rational normal) is mapped down to a plane conic or the line by repeated adjunction maps. For the second function, the final equation is determined by differential computations in the function field of C once the explicit map to the projective line, which gives the base x function, has been determined.

Example Crv_is_hyperelliptic (H121E15)

> P<a,b,c,d,e,f> := ProjectiveSpace(Rationals(),5);
> C := Curve(P,[
> a^2 + a*c - c*e + 3*d*e + 2*d*f - 2*e^2 - 2*e*f - f^2,
> a*c - b^2,
> a*d - b*c,
> a*e - c^2,
> a*e - b*d,
> b*e - c*d,
> c*e - d^2
> ] );
> boo,hy,mp := IsHyperelliptic(C);
> boo;
true
> hy;
Hyperelliptic Curve defined by y^2 = x^8 + x^6 + x - 1 over Rational Field
> mp;
Mapping from: Sch: C to CrvHyp: hy
with equations :
c*e - d^2 + d*f
-d*f + e*f + f^2
e*f
V2.28, 13 July 2023