Hyperelliptic curves of genus 2 in the smooth model - Elliptic curves

Skip to content
Back to top
View this page
Edit this page

# Hyperelliptic curves of genus 2 in the smooth model

Hyperelliptic curves of genus 2 in the smooth model

AUTHORS:

- David Kohel (2006): initial version

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

class sage.schemes.hyperelliptic_curves.hyperelliptic_g2.HyperellipticCurve_g2(defining_polynomial, f, h, genus: Integer, names=['x', 'y'])

  Bases: `HyperellipticCurve_generic`

  absolute_igusa_invariants_kohel()

    Return the three absolute Igusa invariants used by Kohel [KohECHIDNA].

    See also

    `sage.schemes.hyperelliptic_curves.invariants()`

    EXAMPLES:

    Sage

        sage: R.<x> = QQ[]
        sage: HyperellipticCurve(x^5 - 1).absolute_igusa_invariants_kohel()
        (0, 0, 0)
        sage: HyperellipticCurve(x^5 - x + 1, x^2).absolute_igusa_invariants_kohel()
        (-1030567/178769, 259686400/178769, 20806400/178769)
        sage: HyperellipticCurve((x^5 - x + 1)(3*x + 1), (x^2)(3*x + 1)).absolute_igusa_invariants_kohel()
        (-1030567/178769, 259686400/178769, 20806400/178769)

    Python

        >>> from sage.all import *
        >>> R = QQ['x']; (x,) = R._first_ngens(1)
        >>> HyperellipticCurve(x**Integer(5) - Integer(1)).absolute_igusa_invariants_kohel()
        (0, 0, 0)
        >>> HyperellipticCurve(x**Integer(5) - x + Integer(1), x**Integer(2)).absolute_igusa_invariants_kohel()
        (-1030567/178769, 259686400/178769, 20806400/178769)
        >>> HyperellipticCurve((x**Integer(5) - x + Integer(1))(Integer(3)*x + Integer(1)), (x**Integer(2))(Integer(3)*x + Integer(1))).absolute_igusa_invariants_kohel()
        (-1030567/178769, 259686400/178769, 20806400/178769)

  absolute_igusa_invariants_wamelen()

    Return the three absolute Igusa invariants used by van Wamelen [Wam1999].

    EXAMPLES:

    Sage

        sage: R.<x> = QQ[]
        sage: HyperellipticCurve(x^5 - 1).absolute_igusa_invariants_wamelen()
        (0, 0, 0)
        sage: HyperellipticCurve((x^5 - 1)(x - 2), (x^2)(x - 2)).absolute_igusa_invariants_wamelen()
        (0, 0, 0)

    Python

        >>> from sage.all import *
        >>> R = QQ['x']; (x,) = R._first_ngens(1)
        >>> HyperellipticCurve(x**Integer(5) - Integer(1)).absolute_igusa_invariants_wamelen()
        (0, 0, 0)
        >>> HyperellipticCurve((x**Integer(5) - Integer(1))(x - Integer(2)), (x**Integer(2))(x - Integer(2))).absolute_igusa_invariants_wamelen()
        (0, 0, 0)

  clebsch_invariants()

    Return the Clebsch invariants \((A, B, C, D)\) of Mestre, p 317, [Mes1991].

    See also

    `sage.schemes.hyperelliptic_curves.invariants()`

    EXAMPLES:

    Sage

        sage: R.<x> = QQ[]
        sage: f = x^5 - x^4 + 3
        sage: HyperellipticCurve(f).clebsch_invariants()
        (0, -2048/375, -4096/25, -4881645568/84375)
        sage: HyperellipticCurve(f(2*x)).clebsch_invariants()
        (0, -8388608/375, -1073741824/25, -5241627016305836032/84375)

        sage: HyperellipticCurve(f, x).clebsch_invariants()
        (-8/15, 17504/5625, -23162896/140625, -420832861216768/7119140625)
        sage: HyperellipticCurve(f(2*x), 2*x).clebsch_invariants()
        (-512/15, 71696384/5625, -6072014209024/140625, -451865844002031331704832/7119140625)

    Python

        >>> from sage.all import *
        >>> R = QQ['x']; (x,) = R._first_ngens(1)
        >>> f = x**Integer(5) - x**Integer(4) + Integer(3)
        >>> HyperellipticCurve(f).clebsch_invariants()
        (0, -2048/375, -4096/25, -4881645568/84375)
        >>> HyperellipticCurve(f(Integer(2)*x)).clebsch_invariants()
        (0, -8388608/375, -1073741824/25, -5241627016305836032/84375)

        >>> HyperellipticCurve(f, x).clebsch_invariants()
        (-8/15, 17504/5625, -23162896/140625, -420832861216768/7119140625)
        >>> HyperellipticCurve(f(Integer(2)*x), Integer(2)*x).clebsch_invariants()
        (-512/15, 71696384/5625, -6072014209024/140625, -451865844002031331704832/7119140625)

  igusa_clebsch_invariants()

    Return the Igusa-Clebsch invariants \(I_2, I_4, I_6, I_{10}\) of Igusa and Clebsch [IJ1960].

    See also

    `sage.schemes.hyperelliptic_curves.invariants()`

    EXAMPLES:

    Sage

        sage: R.<x> = QQ[]
        sage: f = x^5 - x + 2
        sage: HyperellipticCurve(f).igusa_clebsch_invariants()
        (-640, -20480, 1310720, 52160364544)
        sage: HyperellipticCurve(f(2*x)).igusa_clebsch_invariants()
        (-40960, -83886080, 343597383680, 56006764965979488256)

        sage: HyperellipticCurve(f, x).igusa_clebsch_invariants()
        (-640, 17920, -1966656, 52409511936)
        sage: HyperellipticCurve(f(2*x), 2*x).igusa_clebsch_invariants()
        (-40960, 73400320, -515547070464, 56274284941110411264)

    Python

        >>> from sage.all import *
        >>> R = QQ['x']; (x,) = R._first_ngens(1)
        >>> f = x**Integer(5) - x + Integer(2)
        >>> HyperellipticCurve(f).igusa_clebsch_invariants()
        (-640, -20480, 1310720, 52160364544)
        >>> HyperellipticCurve(f(Integer(2)*x)).igusa_clebsch_invariants()
        (-40960, -83886080, 343597383680, 56006764965979488256)

        >>> HyperellipticCurve(f, x).igusa_clebsch_invariants()
        (-640, 17920, -1966656, 52409511936)
        >>> HyperellipticCurve(f(Integer(2)*x), Integer(2)*x).igusa_clebsch_invariants()
        (-40960, 73400320, -515547070464, 56274284941110411264)

  is_odd_degree()

    Return `True` if the curve is an odd degree model.

    EXAMPLES:

    Sage

        sage: R.<x> = QQ[]
        sage: f = x^5 - x^4 + 3
        sage: HyperellipticCurve(f).is_odd_degree()
        True

    Python

        >>> from sage.all import *
        >>> R = QQ['x']; (x,) = R._first_ngens(1)
        >>> f = x**Integer(5) - x**Integer(4) + Integer(3)
        >>> HyperellipticCurve(f).is_odd_degree()
        True

  jacobian()

    Return the Jacobian of the hyperelliptic curve.

    Elements of the Jacobian are represented by tuples of the form \((u, v : n)\), where

    - \((u,v)\) is the Mumford representative of a divisor \(P_1 + ... + P_r\),

    - \(n\) is a non-negative integer

    This tuple represents the equivalence class \([P_1 + ... + P_r + n \cdot \infty_+ + m \cdot \infty_- - D_\infty]\), where \(m = g - \deg(u) - n\), and \(\infty_+\), \(\infty_-\) are the points at infinity of the hyperelliptic curve,

    \[D_\infty = \lceil g/2 \rceil \infty_+ + \lfloor g/2 \rfloor \infty_-.\]

    Here, \(\infty_- = \infty_+\), if the hyperelliptic curve is ramified.

    EXAMPLES:

    Sage

        sage: R.<x> = QQ[]
        sage: H = HyperellipticCurve(2*x^5 + 4*x^4 + x^3 - x, x^3 + x + 1)
        sage: J = H.jacobian(); J
        Jacobian of Hyperelliptic Curve over Rational Field defined by y^2 + (x^3 + x + 1)*y = 2*x^5 + 4*x^4 + x^3 - x

    Python

        >>> from sage.all import *
        >>> R = QQ['x']; (x,) = R._first_ngens(1)
        >>> H = HyperellipticCurve(Integer(2)*x**Integer(5) + Integer(4)*x**Integer(4) + x**Integer(3) - x, x**Integer(3) + x + Integer(1))
        >>> J = H.jacobian(); J
        Jacobian of Hyperelliptic Curve over Rational Field defined by y^2 + (x^3 + x + 1)*y = 2*x^5 + 4*x^4 + x^3 - x

    The points \(P = (0, 0)\) and \(Q = (-1, -1)\) are on \(H\). We construct the element \(D_1 = [P - Q] = [P + (-Q) - D_\infty]\) on the Jacobian:

    Sage

        sage: P = H.point([0, 0])
        sage: Q = H.point([-1, -1])
        sage: D1 = J(P,Q); D1
        (x^2 + x, -2*x : 0)

    [Python]

        >>> from sage.all import *
        >>> P = H.point([Integer(0), Integer(0)])
        >>> Q = H.point([-Integer(1), -Integer(1)])
        >>> D1 = J(P,Q); D1
        (x^2 + x, -2*x : 0)

    Elements of the Jacobian can also be constructed by directly providing the Mumford representation:

    Sage

        sage: D1 == J(x^2 + x, -2*x, 0)
        True

    Python

        >>> from sage.all import *
        >>> D1 == J(x**Integer(2) + x, -Integer(2)*x, Integer(0))
        True

    We can also embed single points into the Jacobian. Below we construct \(D_2 = [P - P_0]\), where \(P_0\) is the distinguished point of \(H\) (by default one of the points at infinity):

    Sage

        sage: D2 = J(P); D2
        (x, 0 : 0)
        sage: P0 = H.distinguished_point(); P0
        (1 : 0 : 0)
        sage: D2 == J(P, P0)
        True

    [Python]

        >>> from sage.all import *
        >>> D2 = J(P); D2
        (x, 0 : 0)
        >>> P0 = H.distinguished_point(); P0
        (1 : 0 : 0)
        >>> D2 == J(P, P0)
        True

    We may add elements, or multiply by integers:

    Sage

        sage: 2*D1
        (x, -1 : 1)
        sage: D1 + D2
        (x^2 + x, -1 : 0)
        sage: -D2
        (x, -1 : 1)

    Python

        >>> from sage.all import *
        >>> Integer(2)*D1
        (x, -1 : 1)
        >>> D1 + D2
        (x^2 + x, -1 : 0)
        >>> -D2
        (x, -1 : 1)

    Note that the neutral element is given by \([D_\infty - D_\infty]\), in particular \(n = 1\):

    Sage

        sage: J.zero()
        (1, 0 : 1)

    [Python]

        >>> from sage.all import *
        >>> J.zero()
        (1, 0 : 1)

    There are two more elements of the Jacobian that are only supported at infinity: \([\infty_+ - \infty_-]\) and \([\infty_- - \infty_+]\):

    Sage

        sage: [P_plus, P_minus] = H.points_at_infinity()
        sage: P_plus == P0
        True
        sage: J(P_plus,P_minus)
        (1, 0 : 2)
        sage: J(P_minus, P_plus)
        (1, 0 : 0)

    Python

        >>> from sage.all import *
        >>> [P_plus, P_minus] = H.points_at_infinity()
        >>> P_plus == P0
        True
        >>> J(P_plus,P_minus)
        (1, 0 : 2)
        >>> J(P_minus, P_plus)
        (1, 0 : 0)

class sage.schemes.hyperelliptic_curves.hyperelliptic_g2.HyperellipticCurve_g2_finite_field(projective_model, f, h, genus: Integer, names=['x', 'y'])

  Bases: `HyperellipticCurve_g2`, `HyperellipticCurve_finite_field`

class sage.schemes.hyperelliptic_curves.hyperelliptic_g2.HyperellipticCurve_g2_padic_field(projective_model, f, h, genus: Integer, names=['x', 'y'])

  Bases: `HyperellipticCurve_g2`, `HyperellipticCurve_padic_field`

class sage.schemes.hyperelliptic_curves.hyperelliptic_g2.HyperellipticCurve_g2_rational_field(projective_model, f, h, genus: Integer, names=['x', 'y'])

  Bases: `HyperellipticCurve_g2`, `HyperellipticCurve_rational_field`