Hyperelliptic Curve Point Finding, via ratpoints.

sage.libs.ratpoints.ratpoints(coeffs, H, verbose=False, max=0, min_x_denom=None, max_x_denom=None, intervals=[])

Access the ratpoints library to find points on the hyperelliptic curve:

\(y^2 = a_n x^n + \cdots + a_1 x + a_0.\)

INPUT:

  • coeffs – list of integer coefficients \(a_0\) , \(a_1\), ..., \(a_n\)
  • H – the bound for the denominator and the absolute value of the numerator of the \(x\)-coordinate
  • verbose – if True, ratpoints will print comments about its progress
  • max – maximum number of points to find (if 0, find all of them)

OUTPUT:

The points output by this program are points in (1, ceil(n/2), 1)-weighted projective space. If n is even, then the associated homogeneous equation is \(y^2 = a_n x^n + \cdots + a_1 x z^{n-1} + a_0 z^n\) while if n is odd, it is \(y^2 = a_n x^n z + \cdots + a_1 x z^n + a_0 z^{n+1}\).

EXAMPLE:

sage: from sage.libs.ratpoints import ratpoints
sage: for x,y,z in ratpoints([1..6], 200):
....:     print(-1*y^2 + 1*z^6 + 2*x*z^5 + 3*x^2*z^4 + 4*x^3*z^3 + 5*x^4*z^2 + 6*x^5*z)
0
0
0
0
0
0
0
sage: for x,y,z in ratpoints([1..5], 200):
....:    print(-1*y^2 + 1*z^4 + 2*x*z^3 + 3*x^2*z^2 + 4*x^3*z + 5*x^4)
0
0
0
0
0
0
0
0

sage: for x,y,z in ratpoints([1..200], 1000):
....:    print("{} {} {}".format(x,y,z))
1 0 0
0 1 1
0 -1 1
201 25353012004564588029934064107520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 200
201 -25353012004564588029934064107520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 200

The denominator of \(x\) can be restricted, for example to find integral points:

sage: from sage.libs.ratpoints import ratpoints
sage: coeffs = [400, -112, 0, 1]
sage: ratpoints(coeffs, 10^6, max_x_denom=1, intervals=[[-10,0],[1000,2000]])
[(1, 0, 0), (-8, 28, 1), (-8, -28, 1), (-7, 29, 1), (-7, -29, 1),
 (-4, 28, 1), (-4, -28, 1), (0, 20, 1), (0, -20, 1), (1368, 50596, 1),
 (1368, -50596, 1), (1624, 65444, 1), (1624, -65444, 1)]

sage: ratpoints(coeffs, 1000, min_x_denom=100, max_x_denom=200)
[(1, 0, 0),
(-656, 426316, 121),
(-656, -426316, 121),
(452, 85052, 121),
(452, -85052, 121),
(988, 80036, 121),
(988, -80036, 121),
(-556, 773188, 169),
(-556, -773188, 169),
(264, 432068, 169),
(264, -432068, 169)]

Finding the integral points on the compact component of an elliptic curve:

sage: E = EllipticCurve([0,1,0,-35220,-1346400])
sage: e1, e2, e3 = E.division_polynomial(2).roots(multiplicities=False)
sage: coeffs = [E.a6(),E.a4(),E.a2(),1]
sage: ratpoints(coeffs, 1000, max_x_denom=1, intervals=[[e3,e2]])
[(1, 0, 0),
(-165, 0, 1),
(-162, 366, 1),
(-162, -366, 1),
(-120, 1080, 1),
(-120, -1080, 1),
(-90, 1050, 1),
(-90, -1050, 1),
(-85, 1020, 1),
(-85, -1020, 1),
(-42, 246, 1),
(-42, -246, 1),
(-40, 0, 1)]