[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 y^2 + 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(h, f) : RngUPolElt, RngUPolElt -> CrvHyp
HyperellipticCurve(h, f) : RngElt, RngUPolElt -> CrvHyp
HyperellipticCurve(h, f) : RngUPolElt, RngElt -> CrvHyp
HyperellipticCurve(f) : RngUPolElt -> CrvHyp
HyperellipticCurve([h, f]) : [ RngUPolElt ] -> CrvHyp
Given two polynomials h and f in R[x] where R is a field or integral domain, this function returns the nonsingular hyperelliptic curve C: y^2 + 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.
HyperellipticCurveOfGenus(g, h, f) : RngIntElt, RngUPolElt, RngUPolElt -> CrvHyp
HyperellipticCurveOfGenus(g, h, f) : RngIntElt, RngElt, RngUPolElt -> CrvHyp
HyperellipticCurveOfGenus(g, h, f) : RngIntElt, RngUPolElt, RngElt -> CrvHyp
HyperellipticCurveOfGenus(g, f) : RngIntElt, RngUPolElt -> CrvHyp
HyperellipticCurveOfGenus(g, [h, f]) : RngIntElt, [RngUPolElt] -> CrvHyp
Given a positive integer g and two polynomials h and f in R[x] where R is a field or integral domain, this function returns the nonsingular hyperelliptic curve of genus g given by C: y^2 + 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 not 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) : SchEll -> CrvHyp, Map
Returns the hyperelliptic curve C corresponding to the elliptic curve E, followed by the map from E to C.

Creation Predicates

IsHyperellipticCurve([h, g]) : [ RngUPolElt ] -> BoolElt, CrvHyp
Given a sequence containing two polynomials h, f in R[x], where R is an integral domain, return true if and only if C: y^2 + h(x)y = f(x) is a hyperelliptic curve. In this case, the curve is returned as a second value.
IsHyperellipticCurveOfGenus(g, [h, f]) : RngIntElt, [RngUPolElt] -> BoolElt, CrvHyp
Given a positive integer g and a sequence containing two polynomials h, f in R[x] where R is an integral domain, return true if and only if C: y^2 + 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 (H86E1)

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 (H86E2)

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+1,x^9-x^2+57]);
> 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));
> DefiningPolynomials(C1);
t + 1
t^9 + 100*t^2 + 57
> C2, f := SimplifiedModel(C1);
> DefiningPolynomials(C2);
0
4*t^9 + 98*t^2 + 2*t + 27
> 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 for Hyperelliptic Curves

SimplifiedModel(C) : CrvHyp -> CrvHyp, MapCrvHyp
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 y^2 = f(x), followed by the isomorphism C -> C'.
IntegralModel(C) : CrvHyp -> CrvHyp, MapCrvHyp
    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 map C -> C'. If Reduce is set true, common divisors of the coefficients are eliminated as far as possible.
HasOddDegreeModel(C) : CrvHyp -> BoolElt, CrvHyp, MapCrvHyp
Given a hyperelliptic curve C, this function returns true if C has a model C' of the form y^2 = f(x), with f of odd degree. If so, C' is returned together with the map C -> C'.
MinimalWeierstrassModel(C) : CrvHyp -> CrvHyp, MapCrvHyp
    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 10^7. The map C -> C' is returned as a second value.
pNormalModel(C, p) : CrvHyp, RngIntElt -> CrvHyp, MapCrvHyp
    SetVerbose("CrvHypMinimal", n):     Maximum: 3
Given a hyperelliptic curve C defined over the rationals and a prime p, this function returns a normal Weierstrass model C' of the curve over the p-adic integers. The map C -> C' is returned as a second value.
pMinimalWeierstrassModel(C, p) : CrvHyp, RngIntElt -> CrvHyp, MapCrvHyp
    SetVerbose("CrvHypMinimal", n):     Maximum: 3
Given a hyperelliptic curve C defined over the rationals and a prime p, this function returns a minimal Weierstrass model C' of C with respect to the p-adic valuation. The map C -> C' is returned as a second value.
ReducedModel(C) : CrvHyp -> CrvHyp, MapCrvHyp
    Simple: BoolElt                     Default: false
    SetVerbose("CrvHypReduce", n):      Maximum: 3
Given a hyperelliptic curve C with integral coefficients, this computes a model C' that is reduced with respect to the action of SL(2, Z). In addition, the map C -> C' is returned. (Compare Reduce.)
ReducedMinimalWeierstrassModel(C) : CrvHyp -> CrvHyp, MapCrvHyp
    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 Weierstrass model C' of C that is reduced with respect to the action of SL(2, Z). In addition, the map C -> C' is returned. (Compare Reduce.)

Predicates on Curve Models

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
Given a hyperelliptic curve C and a prime p, the function returns true if C has p-adically integral coefficients, and false otherwise.
IspNormal(C, p) : CrvHyp, RngIntElt -> BoolElt
Given a hyperelliptic curve C and a prime p, the function returns true if C is normal over the p-adic integers, and false otherwise.
IspMinimal(C, p) : CrvHyp, RngIntElt -> BoolElt, BoolElt
Given a hyperelliptic curve C and a prime p, the function returns values as follows:

Twisting Hyperelliptic Curves

QuadraticTwist(C, d) : CrvHyp, RngElt -> CrvHyp
Given a hyperelliptic curve C defined over a finite field k 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 quadratic twist of C by a primitive element of k.
QuadraticTwists(C) : CrvHyp -> SeqEnum
Given a hyperelliptic curve C defined over a finite field k, return a sequence containing the non-isomorphic quadratic twists of C.

IsQuadraticTwist(C1, C2) : 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.

Example CrvHyp_QuadraticTwists (H86E3)

We construct the quadratic twists of the hyperelliptic curve y^2=x^6 + x^2 + 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 (H86E4)

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 C_7 and not isomorphic. We then extend the field of definition of both curves to Q(sqrt(7)) and discover that the lifted curves are isomorphic!

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

Type Change Predicates

IsEllipticCurve(C) : CrvHyp -> BoolElt, CrvEll, Map
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]