Constructor for hyperelliptic curves using the smooth model

Uses weighted projective space \(\mathbb{P}(1 : g + 1 : 1)\).

TODO:

  • We do not yet support the construction of hyperelliptic curves over rings

AUTHORS:

  • David Kohel (2006): initial version

  • Anna Somoza (2019-04): dynamic class creation

  • Sabrina Kunzweiler, Gareth Ma, Giacomo Pope (2024): adapt to smooth model

sage.schemes.hyperelliptic_curves.constructor.HyperellipticCurve(f, h=0, names=['x', 'y'], check_squarefree=True, distinguished_point=None)[source]

Constructor function for creating a hyperelliptic curve with smooth model with polynomials \(f\), \(h\).

In Sage, a hyperelliptic curve of genus \(g\) is always specified by an (affine) equation in Weierstrass form

\[y^2 + h(x) y = f(x),\]

for some polynomials \(h\) and \(f\). This defines a smooth model in weighted projective space \(\mathbb{P}(1 : g + 1 : 1)\)

\[Y^2 + H(X,Z) Y = F(X,Z),\]

where \(H\) is the degree \(g + 1\) homogenization of \(h\), and \(F\) is the degree \(2 g + 2\) homogenization of \(f\).

INPUT:

  • f – polynomial

  • h (default: 0) – polynomial

  • names – (default: ['x', 'y']) names for the coordinate functions

  • check_squarefree (default: True) – test if the input defines a hyperelliptic curve

  • distinguished_point (default: None) – set a custom

    point to be the distinguished point for arithmetic. One of points at infinity if one so exists.

EXAMPLES:

We create a hyperelliptic curve over the rationals:

sage: R.<x> = PolynomialRing(QQ)
sage: H = HyperellipticCurve(x^8+1, x^4+1); H
Hyperelliptic Curve over Rational Field defined by y^2 + (x^4 + 1)*y = x^8 + 1

This hyperelliptic curve has no points at infinity, i.e. \(H\) is inert:

sage: H.points_at_infinity()
[]
sage: H.is_inert()
True

We can extend the base field to obtain a hyperelliptic curve with two points at infinity:

sage: K.<alpha> = QQ.extension(x^2+x-1)
sage: HK = H.change_ring(K)
sage: HK.points_at_infinity()
[(1 : alpha : 0), (1 : -alpha - 1 : 0)]
sage: HK.is_split()
True

The construction of hyperelliptic curves is supported over different fields. The correct class is chosen automatically:

sage: F = FiniteField(13)
sage: S.<x> = PolynomialRing(F)
sage: HF = HyperellipticCurve(x^5 + x^4 + x^3 + x^2 + x + 1, x^3 + x); HF
Hyperelliptic Curve over Finite Field of size 13 defined by y^2 + (x^3 + x)*y = x^5 + x^4 + x^3 + x^2 + x + 1
sage: type(HF)
<class 'sage.schemes.hyperelliptic_curves.hyperelliptic_g2.HyperellipticCurve_g2_finite_field_with_category'>
sage: Q5 = Qp(5,10)
sage: T.<x> = Q5[]
sage: H5 = HyperellipticCurve(x^7 + 1); H5
Hyperelliptic Curve over 5-adic Field with capped relative precision 10 defined by (1 + O(5^10))*y^2 = (1 + O(5^10))*x^7 + 1 + O(5^10)
sage: type(H5)
<class 'sage.schemes.hyperelliptic_curves.hyperelliptic_padic_field.HyperellipticCurve_padic_field_with_category'>

The input polynomials need not be monic:

sage: R.<x> = QQ[]
sage: HyperellipticCurve(3*x^5+1)
Hyperelliptic Curve over Rational Field defined by y^2 = 3*x^5 + 1

The polynomials \(f\) and \(h\) need to define a smooth curve of genus at least one. In particular polynomials defining elliptic curves are allowed as input:

sage: E = HyperellipticCurve(x^3+1)
sage: E.genus()
1
sage: HyperellipticCurve(x)
Traceback (most recent call last):
...
ValueError: arguments f = x and h = 0 must define a curve of genus at least one.

The following polynomials define a singular curve and are not allowed as input:

sage: C = HyperellipticCurve(x^6 + 2*x - 1, 2*x - 2)
Traceback (most recent call last):
...
ValueError: singularity in the provided affine patch

The constructor accepts a distinguished point as an argument, allowing the user to pick which point at infinity is selected in the case there is more than one for the given curve model:

sage: C = HyperellipticCurve(x^5 + x + 2, distinguished_point=(1, -2))
sage: C.distinguished_point()
(1 : -2 : 1)

We can change the names of the variables in the output:

sage: k.<a> = GF(9); R.<x> = k[]                                                # needs sage.rings.finite_rings
sage: HyperellipticCurve(x^3 + x - 1, x + a, names=['u','v'])                   # needs sage.rings.finite_rings
Hyperelliptic Curve over Finite Field in a of size 3^2
 defined by v^2 + (u + a)*v = u^3 + u + 2