[Next][Prev] [Right] [Left] [Up] [Index] [Root]

Creation Functions

Subsections

Creation of a Hyperelliptic Curve

A hyperelliptic curve C given by a generalized Weierstrass equation y2 + h(x) y = f(x) is created by specifying polynomials h(x) and f(x) over a field K. The class of hyperelliptic curves includes curves of genus one, and a hyperelliptic curve may also be constructed by type change from an elliptic curve E. Note that the ambient space of C is a weighted projective space in which the one or two points at infinity are nonsingular.

HyperellipticCurve(f, h) : RngUPolElt, RngUPolElt -> CrvHyp
HyperellipticCurve(f, h) : RngElt, RngUPolElt -> CrvHyp
HyperellipticCurve(f, h) : RngUPolElt, RngElt -> CrvHyp
HyperellipticCurve(f) : RngUPolElt -> CrvHyp
HyperellipticCurve([f, h]) : [ RngUPolElt ] -> CrvHyp
Given two polynomials h and f ∈R[x] where R is a field or integral domain, this function returns the nonsingular hyperelliptic curve C: y2 + h(x)y = f(x). If h(x) is not given, then it is taken as zero. If R is an integral domain rather than a field, the base field of the curve is taken to be the field of fractions of R. An error is returned if the given curve C is singular.
HyperellipticCurve(P, f, h) : Prj, RngUPolElt, RngUPolElt -> CrvHyp
Create the hyperelliptic curve as described above using the projective space P as the ambient. The ambient P should have dimension 2.
HyperellipticCurveOfGenus(g, f, h) : RngIntElt, RngUPolElt, RngUPolElt -> CrvHyp
HyperellipticCurveOfGenus(g, f, h) : RngIntElt, RngElt, RngUPolElt -> CrvHyp
HyperellipticCurveOfGenus(g, f, h) : RngIntElt, RngUPolElt, RngElt -> CrvHyp
HyperellipticCurveOfGenus(g, f) : RngIntElt, RngUPolElt -> CrvHyp
HyperellipticCurveOfGenus(g, [f, h]) : RngIntElt, [RngUPolElt] -> CrvHyp
Given a positive integer g and two polynomials h and f ∈R[x] where R is a field or integral domain, this function returns the nonsingular hyperelliptic curve of genus g given by C: y2 + h(x)y = f(x). If h(x) is not given, then it is taken as zero. Before attempting to create C, the function checks that its genus will be g by testing various numerical conditions on f and g. If the genus is not correct, a runtime error is raised. If R is an integral domain rather than a field, the base field of C is taken to be the field of fractions of R. An error is returned if the curve C is singular.
HyperellipticCurve(E) : CrvEll -> CrvHyp, Map
Returns the hyperelliptic curve C corresponding to the elliptic curve E, followed by the map from E to C.

Creation Predicates

IsHyperellipticCurve([f, h]) : [ RngUPolElt ] -> BoolElt, CrvHyp
Given a sequence containing two polynomials h, f ∈R[x], where R is an integral domain, return true if and only if C: y2 + h(x)y = f(x) is a hyperelliptic curve. In this case, the curve is returned as a second value.
IsHyperellipticCurveOfGenus(g, [f, h]) : RngIntElt, [RngUPolElt] -> BoolElt, CrvHyp
Given a positive integer g and a sequence containing two polynomials h, f ∈R[x] where R is an integral domain, return true if and only if C: y2 + h(x)y = f(x) is a hyperelliptic curve of genus g. In this case, the curve is returned as a second value.

Example CrvHyp_Creation (H125E1)

Create a hyperelliptic curve over the rationals:

> P<x> := PolynomialRing(RationalField());
> C := HyperellipticCurve(x^6+x^2+1);
> C;
Hyperelliptic Curve defined by y^2 = x^6 + x^2 + 1 over Rational Field
> C![0,1,1];
(0 : 1 : 1)

Now create the same curve over a finite field:

> P<x> := PolynomialRing(GF(7));
> C := HyperellipticCurve(x^6+x^2+1);
> C;
Hyperelliptic Curve defined by y^2 = x^6 + x^2 + 1 over GF(7)
> C![0,1,1];
(0 : 1 : 1)

Changing the Base Ring

BaseChange(C, K) : Sch, Fld -> Sch
BaseExtend(C, K) : Sch, Fld -> Sch
Given a hyperelliptic curve C defined over a field k, and a field K which is an extension of k, return a hyperelliptic curve C' over K using the natural inclusion of k in K to map the coefficients of C into elements of K.
BaseChange(C, j) : Sch, Map -> Sch
BaseExtend(C, j) : Sch, Map -> Sch
Given a hyperelliptic curve C defined over a field k and a ring map j : k -> K, return a hyperelliptic curve C' over K by applying j to the coefficients of E.
BaseChange(C, n) : Sch, RngIntElt -> Sch
BaseExtend(C, n) : Sch, RngIntElt -> Sch
If C is a hyperelliptic curve defined over a finite field k and a positive integer n, let K denote the extension of k of degree n. This function returns a hyperelliptic curve C' over K using the natural inclusion of k in K to map the coefficients of C into elements of K.
ChangeRing(C, K) : Sch, Rng -> Sch
Given a hyperelliptic curve C defined over a field k, and a field K, return a hyperelliptic curve C' over K that is obtained from C by by mapping the coefficients of C into K using the standard coercion map from k to K. This is useful when there is no appropriate ring homomorphism between k and K (e.g., when k=Q and K is a finite field).

Example CrvHyp_BaseExtension (H125E2)

We construct a curve C over the rationals and use ChangeRing to construct the corresponding curve C1 over GF(101).

> P<x> := PolynomialRing(RationalField());
> C := HyperellipticCurve([x^9-x^2+57,x+1]);
> C1 := ChangeRing(C, GF(101));
> C1;
Hyperelliptic Curve defined by y^2 + (x + 1)*y = x^9 + 100*x^2 + 57 
over GF(101)
> Q<t> := PolynomialRing(GF(101));
> HyperellipticPolynomials(C1);
t^9 + 100*t^2 + 57
t + 1
> C2, f := SimplifiedModel(C1);
> HyperellipticPolynomials(C2);
4*t^9 + 98*t^2 + 2*t + 27
0
> P1 := C1![31,30,1];
> P1;
(31 : 30 : 1)
> Q := P1@f; // evaluation 
> Q;
(31 : 92 : 1)
> Q@@f; // pullback 
(31 : 30 : 1)

An explanation of the syntax for isomorphisms of hyperelliptic curves and the functions for models is given below.


Models

SimplifiedModel(C) : CrvHyp -> CrvHyp, MapIsoSch
Given a hyperelliptic curve C defined over a field of characteristic not equal to 2, this function returns an isomorphic hyperelliptic curve C' of the form y2 = f(x), followed by the isomorphism C -> C'.
HasOddDegreeModel(C) : CrvHyp -> BoolElt, CrvHyp, MapIsoSch
Given a hyperelliptic curve C, this function returns true if C has a model C' of the form y2 = f(x), with f of odd degree. If so, C' is returned together with the isomorphism C -> C'.
IntegralModel(C) : CrvHyp -> CrvHyp, MapIsoSch
    Reduce: BoolElt                     Default: false
Given a hyperelliptic curve C defined over the rationals, this function returns an isomorphic curve C' given by polynomials with integral coefficients, together with the isomorphism C -> C'. If Reduce is set true, common divisors of the coefficients are eliminated as far as possible.
MinimalWeierstrassModel(C) : CrvHyp -> CrvHyp, MapIsoSch
    Bound: RngIntElt                    Default: 0
    SetVerbose("CrvHypMinimal", n):     Maximum: 3
Given a hyperelliptic curve C defined over the rationals, this function returns a globally minimal Weierstrass model C' of C. If Bound is set, it gives an upper bound for the bad primes that are checked. As this calculation uses trial division, Bound should not be set much larger than 107. The isomorphism C -> C' is returned as a second value.
pIntegralModel(C, p) : CrvHyp, RngIntElt -> CrvHyp, MapIsoSch
pIntegralModel(C, p) : CrvHyp, FldRatElt -> CrvHyp, MapIsoSch
pIntegralModel(C, p) : CrvHyp, RngUPolElt -> CrvHyp, MapIsoSch
pIntegralModel(C, p) : CrvHyp, FldFunRatUElt -> CrvHyp, MapIsoSch
pIntegralModel(C, p) : CrvHyp, Infty -> CrvHyp, MapIsoSch
    SetVerbose("CrvHypMinimal", n):     Maximum: 3
Given a hyperelliptic curve C defined over Q or a rational function field, this function returns a model C' of the curve that is integral at the place p given as an integer, rational, polynomial, rational function or ∞. The isomorphism C -> C' is returned as a second value.
pNormalModel(C, p) : CrvHyp, RngIntElt -> CrvHyp, MapIsoSch
pNormalModel(C, p) : CrvHyp, FldRatElt -> CrvHyp, MapIsoSch
pNormalModel(C, p) : CrvHyp, RngUPolElt -> CrvHyp, MapIsoSch
pNormalModel(C, p) : CrvHyp, FldFunRatUElt -> CrvHyp, MapIsoSch
pNormalModel(C, p) : CrvHyp, Infty -> CrvHyp, MapIsoSch
    SetVerbose("CrvHypMinimal", n):     Maximum: 3
Given a hyperelliptic curve C defined over Q or a rational function field, this function returns a model C' of the curve that is normal at the place p given as an integer, rational, polynomial, rational function or ∞. The isomorphism C -> C' is returned as a second value.
pMinimalWeierstrassModel(C, p) : CrvHyp, RngIntElt -> CrvHyp, MapIsoSch
pMinimalWeierstrassModel(C, p) : CrvHyp, FldRatElt -> CrvHyp, MapIsoSch
pMinimalWeierstrassModel(C, p) : CrvHyp, RngUPolElt -> CrvHyp, MapIsoSch
pMinimalWeierstrassModel(C, p) : CrvHyp, FldFunRatUElt -> CrvHyp, MapIsoSch
pMinimalWeierstrassModel(C, p) : CrvHyp, Infty -> CrvHyp, MapIsoSch
    SetVerbose("CrvHypMinimal", n):     Maximum: 3
Given a hyperelliptic curve C defined over Q or a rational function field, this function returns a Weierstrass model C' of the curve that is minimal at the place p given as an integer, rational, polynomial, rational function or ∞. The isomorphism C -> C' is returned as a second value.
ReducedModel(C) : CrvHyp -> CrvHyp, MapIsoSch
    Simple: BoolElt                     Default: false
    Al: MonStgElt                       Default: "Stoll"
    SetVerbose("CrvHypReduce", n):      Maximum: 3
Given a hyperelliptic curve C with integral coefficients, this computes a reduced model C'. If the Stoll algorithm is used (default) then the curve argument must have integral coefficients and reduction is performed with respect to the action of SL2(Z) on the (x, z)-coordinates. If the Wamelen algorithm is used, (Al := "Wamelen"), the curve must have genus 2. The isomorphism C -> C' is currently returned only for the algorithm of Stoll.
ReducedMinimalWeierstrassModel(C) : CrvHyp -> CrvHyp, MapIsoSch
    Simple: BoolElt                     Default: false
    SetVerbose("CrvHypMinimal", n):     Maximum: 3
    SetVerbose("CrvHypReduce", n):      Maximum: 3
Given a hyperelliptic curve C defined over the rationals, this function returns a globally minimal integral Weierstrass model C' of C that is reduced with respect to the action of SL2(Z), using Stoll's algorithm in ReducedModel. The isomorphism C -> C' is returned as a second value.
SetVerbose("CrvHypReduce", v) : MonStgElt, RngIntElt ->
This sets the verbose printing level for the curve reduction algorithms of Stoll and Wamelen. The second argument can take integral values in the interval [0, 3], or boolean values: false (equivalent to 0) and true (equivalent to 1).

Predicates on Models

IsSimplifiedModel(C) : CrvHyp -> BoolElt
Returns true if the hyperelliptic curve C is of the form y2 = f(x).
IsIntegral(C) : CrvHyp -> BoolElt
Given a hyperelliptic curve C, the function returns true if C has integral coefficients, and false otherwise.
IspIntegral(C, p) : CrvHyp, RngIntElt -> BoolElt
IspIntegral(C, p) : CrvHyp, RngUPolElt -> BoolElt
IspIntegral(C, p) : CrvHyp, Infty -> BoolElt
Given a hyperelliptic curve C defined over Q or a rational function field, this function returns true if the given model of C is integral at the given place.
IspNormal(C, p) : CrvHyp, RngIntElt -> BoolElt
IspNormal(C, p) : CrvHyp, RngUPolElt -> BoolElt
IspNormal(C, p) : CrvHyp, Infty -> BoolElt
Given a hyperelliptic curve C defined over Q or a rational function field, this function returns true if the given model of C is normal at the given place.
IspMinimal(C, p) : CrvHyp, RngIntElt -> BoolElt, BoolElt
IspMinimal(C, p) : CrvHyp, RngUPolElt -> BoolElt, BoolElt
IspMinimal(C, p) : CrvHyp, Infty -> BoolElt, BoolElt
Given a hyperelliptic curve C defined over Q or a rational function field, this function decides whether the given model of C is minimal at the given place. The returned values as follows:

false, false if C is not an integral minimal model at the given place.

true, false if C is integral and minimal at the given place, but not the unique minimal model (up to transformations that are invertible over the local ring).

true, false if C is the unique integral minimal model at the given place, (up to transformations that are invertible over the local ring).

Twisting Hyperelliptic Curves

There are standard functions for quadratic twists of hyperelliptic curves in characteristic not equal to 2. In addition, from the new package of Lercier and Ritzenthaler (described in more detail in the next section) there are functions to return all twists of a genus 2 hyperelliptic curve over a finite field of any characteristic.

QuadraticTwist(C, d) : CrvHyp, RngElt -> CrvHyp
Given a hyperelliptic curve C defined over a field k of characteristic not equal to 2 and an element d that is coercible into k, return the quadratic twist of C by d.
QuadraticTwist(C) : CrvHyp -> CrvHyp
Given a hyperelliptic curve C defined over a finite field k, return the standard quadratic twist of C over the unique extension of k of degree 2. If the characteristic of k is odd, then this is the same as the twist of C by a primitive element of k.
QuadraticTwists(C) : CrvHyp -> SeqEnum
Given a hyperelliptic curve C defined over a finite field k of odd characteristic, return a sequence containing the non-isomorphic quadratic twists of C.

IsQuadraticTwist(C, D) : CrvHyp, CrvHyp -> BoolElt, RngElt
    SetVerbose("CrvHypIso", n):         Maximum: 3
Given hyperelliptic curves C and D over a common field k having characteristic not equal to two, return true if and only if C is a quadratic twist of D over k. If so, the twisting factor is returned as the second value.
Twists(C) : CrvHyp -> SeqEnum[CrvHyp], GrpPerm
Twists(GI) : SeqEnum[FldFin] -> SeqEnum[CrvHyp], GrpPerm
For C a genus 2 or 3 hyperelliptic curve over a finite field k, returns the sequence of all twists of C (ie, a set of representatives of all isomorphism classes of curves over k isomorphic to C over bar(k)) along with the abstract geometric automorphism group of C (and all of its twists) as a permutation group.

For genus 2, k can be any characteristic. For genus 3, the characteristic of k must be at least 11 and the model of C of the form y2=f(x).

There is also a version where the argument is GI, the sequence of Cardona-Quer-Nart-Pujola invariants of a genus 2 curve over a finite field (see Section Igusa Invariants) which returns the full set of isomorphism classes (twists) of curves over k with the given invariants.

These functions are part of the package contributed by Lercier and Ritzenthaler which is more fully described in the Igusa invariants section.

HyperellipticPolynomialsFromShiodaInvariants(JI) : SeqEnum -> SeqEnum, GrpPerm
Computes and returns all twists of a genus 3 hyperelliptic curve and its geometric automorphism group corresponding to a sequence of Shioda invariants JI (see Section Shioda Invariants) over a finite field of characteristic at least 11. In fact the first return value is a sequence of polynomials f(x) of degree 7 or 8 such that the twisted curves correspond to y2=f(x). The reason for this is that JI could be a singular set of invariants corresponding to polynomials f with discriminant zero. In that case, these do not correspond to hyperelliptic curves, but it might be useful to get the full set of twists anyway.

This function comes from the genus 3 package contributed by Lercier and Ritzenthaler.


Example CrvHyp_QuadraticTwists (H125E3)

We construct the quadratic twists of the hyperelliptic curve y2=x6 + x2 + 1 defined over GF(7).

> P<x> := PolynomialRing(GF(7));
> C := HyperellipticCurve(x^6+x^2+1);
> QuadraticTwists(C);
[
    Hyperelliptic Curve defined by y^2 = x^6 + x^2 + 1 over GF(7),
    Hyperelliptic Curve defined by y^2 = 3*x^6 + 3*x^2 + 3 over GF(7)
]
> IsIsomorphic($1[1],$1[2]);
false

Example CrvHyp_QuadraticTwists (H125E4)

We take a hyperelliptic curve over the rationals and form a quadratic twist of it.

> P<x> := PolynomialRing(Rationals());
> C := HyperellipticCurve(x^6+x);
> C7 := QuadraticTwist(C, 7);
> C7;
Hyperelliptic Curve defined by y^2 = 7*x^6 + 7*x over Rational Field

We now use the function IsIsomorphic to verify that C and C7 are nonisomorphic. We then extend the field of definition of both curves to Q(Sqrt(7)) and verify that the curves become isomorphic over this extension.

> IsIsomorphic(C, C7);                                                 
false
> K<w> := ext< Rationals() | x^2-7 >;                                  
> CK := BaseChange(C, K);                                              
> C7K := BaseChange(C7, K);                                            
> IsIsomorphic(CK, C7K);                                               
true (x : y : z) :-> (x : -1/7*w*y : z)

Example CrvHyp_QuadraticTwists (H125E5)

We find all the twists of a supersingular genus 2 curve over F2.

> P<x> := PolynomialRing(GF(2));
> C := HyperellipticCurve(x^5,P!1);                                            
> C;
Hyperelliptic Curve defined by y^2 + y = x^5 over GF(2)
> tws,auts := Twists(C);
> tws;
[
    Hyperelliptic Curve defined by y^2 + y = x^5 over GF(2),
    Hyperelliptic Curve defined by y^2 + y = x^5 + x^4 over GF(2),
    Hyperelliptic Curve defined by y^2 + y = x^5 + x^4 + 1 over GF(2)
]
> #auts; // auts is the geometric automorphism group of C
160

Type Change Predicates

IsEllipticCurve(C) : CrvHyp -> BoolElt, CrvEll, MapIsoSch, MapIsoSch
The function returns true if and only if C is a genus one hyperelliptic curve of odd degree, in which case it also returns an elliptic curve E isomorphic to C followed by the isomorphism C -> E and the inverse isomorphism E -> C.
 [Next][Prev] [Right] [Left] [Up] [Index] [Root]

Version: V2.19 of Wed Apr 24 15:09:57 EST 2013