Rational point sets on a Jacobian of a hyperelliptic curve (split case)

Uses the balanced divisors technique described in [Mireles2008], [GHM2008], and [Gal2018].

AUTHORS:

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

class sage.schemes.hyperelliptic_curves.jacobian_homset_split.HyperellipticJacobianHomsetSplit(Y, X, **kwds)[source]

Bases: HyperellipticJacobianHomset

Create the Jacobian Hom-set of a hyperelliptic curve with two rational points at infinity.

Element[source]

alias of MumfordDivisorClassFieldSplit

cantor_compose_at_infinity(u0, v0, n0, plus=True)[source]

Compute the composition of \((u_0,v_0,n_0)\) with a divisor supported at \(\infty_+\) (default) or \(\infty_-\) , and apply a reduction step.

Follows algorithm 3.6 of [Mireles2008].

EXAMPLES:

sage: R.<x> = GF(7)[]
sage: H = HyperellipticCurve(x^8 + 3*x + 2)
sage: JF = Jacobian(H).point_homset()
sage: D1 = [x^2 + 4*x + 3, 2*x + 2, 1]

Composing at \(\infty_+\) decreases the value of \(n_0\) , while composing at \(\infty_-\) increases that value:

sage: JF.cantor_compose_at_infinity(x^2 + 4*x + 3, 2*x + 2, 1)
(x^2 + 3*x + 6, 5*x + 5, -1)
sage: JF.cantor_compose_at_infinity(x^2 + 4*x + 3, 2*x + 2, 1, plus=False)
(x^3 + 6*x^2 + x + 4, 5*x + 5, 2)
cantor_composition(u1, v1, n1, u2, v2, n2)[source]

Return the Cantor composition of the divisors represented by (u1, v1, n1) and (u2, v2, n2). Here n1 and n2 denote the multiplicity of the point \(\infty_+\).

Follows algorithm 3.4 of [Mireles2008].

TODO: when h = 0 we can speed this up.

EXAMPLES:

sage: R.<x> = GF(7)[]
sage: H = HyperellipticCurve(x^8 + 3*x + 2)
sage: JF = Jacobian(H).point_homset()
sage: D1 = [x^2 + 4*x + 3, 2*x + 2, 1]
sage: assert JF(D1)
sage: D2 = [x^3 + 6*x^2 + 6*x, 6*x^2 + 6*x + 3, 0]
sage: assert JF(D2)
sage: D3 = JF.cantor_composition(*D1, *D2); D3
(x^5 + 3*x^4 + 5*x^3 + 4*x, 3*x^3 + 3*x^2 + 3*x + 3, -1)
cantor_reduction(u0, v0, n0)[source]

Compute the Cantor reduction of (u0,v0,n0), where (u0,v0) represent an affine semi-reduced divisor and n0 is the multiplicity of the point \(\infty_+\).

Follows algorithm 3.5 of [Mireles2008].

EXAMPLES:

sage: R.<x> = GF(7)[]
sage: H = HyperellipticCurve(x^8 + 3*x + 2)
sage: JF = Jacobian(H).point_homset()
sage: D1 = [x^2 + 4*x + 3, 2*x + 2, 1]
sage: D2 = [x^3 + 6*x^2 + 6*x, 6*x^2 + 6*x + 3, 0]
sage: D3 = JF.cantor_composition(*D1, *D2); D3
(x^5 + 3*x^4 + 5*x^3 + 4*x, 3*x^3 + 3*x^2 + 3*x + 3, -1)
sage: JF.cantor_reduction(*D3)
(x^3 + 4*x^2 + 2*x + 5, 2*x^2 + 3*x + 5, 0)
point_to_mumford_coordinates(P)[source]

On input a point P, return the Mumford coordinates of (the affine part of) the divisor \([P]\) and an integer \(n\), where

  • \(n = 1\) if P is the point \(\infty_+\)

  • \(n = 0\) otherwise .

EXAMPLES:

sage: R.<x> = QQ[]
sage: H = HyperellipticCurve(x^6 - 8*x^4 + 6*x^3 + 8*x^2 - 4*x + 1)
sage: P = H([-1, 46, 3]); P
(-1/3 : 46/27 : 1)
sage: O = H([1,1,0])
sage: JQ = H.jacobian()(QQ)
sage: JQ.point_to_mumford_coordinates(P)
(x + 1/3, 46/27, 0)
sage: JQ.point_to_mumford_coordinates(O)
(1, 0, 1)
zero(check=True)[source]

Return the zero element of the Jacobian

EXAMPLES

sage: R.<x> = QQ[]
sage: H = HyperellipticCurve(x^8 + 1)
sage: J = Jacobian(H)
sage: J.zero()
(1, 0 : 2)