Arithmetic on the Jacobian

This module implements the group operation in the Picard group of a hyperelliptic curve, represented as divisors in Mumford representation, using Cantor’s algorithm.

AUTHORS:

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

class sage.schemes.hyperelliptic_curves.jacobian_morphism.MumfordDivisorClassField(parent, u, v, check=True)[source]

Bases: AdditiveGroupElement, SchemeMorphism

An element of a Jacobian defined over a field, i.e. in \(J(K) = \mathrm{Pic}^0_K(C)\).

degree()[source]

Returns the degree of the affine part of the divisor.

EXAMPLES:

sage: R.<x> = QQ[]
sage: H = HyperellipticCurve(6*x^5 + 9*x^4 - x^3 - 3*x^2, 1)
sage: J = H.jacobian()
sage: J.zero().degree()
0
sage: J(x, 0).degree()
1
sage: J(x^2 + 1/2*x, -x - 1).degree()
2
>>> from sage.all import *
>>> R = QQ['x']; (x,) = R._first_ngens(1)
>>> H = HyperellipticCurve(Integer(6)*x**Integer(5) + Integer(9)*x**Integer(4) - x**Integer(3) - Integer(3)*x**Integer(2), Integer(1))
>>> J = H.jacobian()
>>> J.zero().degree()
0
>>> J(x, Integer(0)).degree()
1
>>> J(x**Integer(2) + Integer(1)/Integer(2)*x, -x - Integer(1)).degree()
2
order()[source]

Returns the order of self. This is only implemented over finite fields.

EXAMPLES:

sage: K = FiniteField(7)
sage: R.<x> = K[]
sage: H = HyperellipticCurve(x^6 + 3*x + 2)
sage: JK = Jacobian(H)(K)
sage: D = JK(x^2 + 5*x + 6, 6*x + 3)
sage: D.order()
38
>>> from sage.all import *
>>> K = FiniteField(Integer(7))
>>> R = K['x']; (x,) = R._first_ngens(1)
>>> H = HyperellipticCurve(x**Integer(6) + Integer(3)*x + Integer(2))
>>> JK = Jacobian(H)(K)
>>> D = JK(x**Integer(2) + Integer(5)*x + Integer(6), Integer(6)*x + Integer(3))
>>> D.order()
38
scheme()[source]

Return the scheme this morphism maps to; or, where this divisor lives.

Warning

Although a pointset is defined over a specific field, the scheme returned may be over a different (usually smaller) field. The example below demonstrates this: the pointset is determined over a number field of absolute degree 2 but the scheme returned is defined over the rationals.

EXAMPLES:

sage: x = QQ['x'].gen()
sage: f = x^5 + x
sage: H = HyperellipticCurve(f)
sage: F.<a> = NumberField(x^2 - 2, 'a')                                     # needs sage.rings.number_field
sage: J = H.jacobian()(F); J                                                # needs sage.rings.number_field
Abelian group of points over Number Field in a with defining polynomial x^2 - 2 on Jacobian of Hyperelliptic Curve over Rational Field defined by y^2 = x^5 + x
>>> from sage.all import *
>>> x = QQ['x'].gen()
>>> f = x**Integer(5) + x
>>> H = HyperellipticCurve(f)
>>> F = NumberField(x**Integer(2) - Integer(2), 'a', names=('a',)); (a,) = F._first_ngens(1)# needs sage.rings.number_field
>>> J = H.jacobian()(F); J                                                # needs sage.rings.number_field
Abelian group of points over Number Field in a with defining polynomial x^2 - 2 on Jacobian of Hyperelliptic Curve over Rational Field defined by y^2 = x^5 + x

sage: P = J(H.lift_x(F(1)))                                                 # needs sage.rings.number_field
sage: P.scheme()                                                            # needs sage.rings.number_field
Jacobian of Hyperelliptic Curve over Rational Field defined by y^2 = x^5 + x
[Python]
>>> from sage.all import *
>>> P = J(H.lift_x(F(Integer(1))))                                                 # needs sage.rings.number_field
>>> P.scheme()                                                            # needs sage.rings.number_field
Jacobian of Hyperelliptic Curve over Rational Field defined by y^2 = x^5 + x
uv()[source]

Return the \(u\) and \(v\) component of this Mumford divisor.

EXAMPLES:

sage: x = polygen(GF(1993))
sage: H = HyperellipticCurve(x^7 + 3 * x + 1)
sage: J = H.jacobian(); J
Jacobian of Hyperelliptic Curve over Finite Field of size 1993 defined by y^2 = x^7 + 3*x + 1
sage: u, v = x^3 + 1570*x^2 + 1930*x + 81, 368*x^2 + 1478*x + 256
sage: P = J(u, v); P
(x^3 + 1570*x^2 + 1930*x + 81, 368*x^2 + 1478*x + 256)
sage: P.uv() == (u, v)
True
>>> from sage.all import *
>>> x = polygen(GF(Integer(1993)))
>>> H = HyperellipticCurve(x**Integer(7) + Integer(3) * x + Integer(1))
>>> J = H.jacobian(); J
Jacobian of Hyperelliptic Curve over Finite Field of size 1993 defined by y^2 = x^7 + 3*x + 1
>>> u, v = x**Integer(3) + Integer(1570)*x**Integer(2) + Integer(1930)*x + Integer(81), Integer(368)*x**Integer(2) + Integer(1478)*x + Integer(256)
>>> P = J(u, v); P
(x^3 + 1570*x^2 + 1930*x + 81, 368*x^2 + 1478*x + 256)
>>> P.uv() == (u, v)
True
class sage.schemes.hyperelliptic_curves.jacobian_morphism.MumfordDivisorClassFieldInert(parent, u, v, check=True)[source]

Bases: MumfordDivisorClassField

Create an element of the Jacobian of an inert hyperelliptic curve.

class sage.schemes.hyperelliptic_curves.jacobian_morphism.MumfordDivisorClassFieldRamified(parent, u, v, check=True)[source]

Bases: MumfordDivisorClassField

Create an element of the Jacobian of a ramified hyperelliptic curve.

class sage.schemes.hyperelliptic_curves.jacobian_morphism.MumfordDivisorClassFieldSplit(parent, u, v, n=0, check=True)[source]

Bases: MumfordDivisorClassField

Create an element of the Jacobian of a split hyperelliptic curve.