Chabauty's Method

This is a method for finding the rational points on a curve C of genus at least 2, that applies when the Mordell-Weil group of Jac(C) has rank less than the genus of C. It involves doing local calculations at some prime where C has good reduction.

For (hyperelliptic) curves of genus 2 over Q, two separate routines are available in Magma. In the older one, the user specifies the prime, and the results usually do not determine the set of rational points precisely. In the new implementation, which is far more powerful, Chabauty calculations are combined with a "Mordell-Weil sieve" which puts together information obtained using many different primes, to determine precisely the set of rational points on the curve. However, this routine does not apply to curves with no rational points, in fact one rational point must be known, as this plays a role in the algorithm.

Both routines are applicable only when the Chabauty condition holds: for a genus 2 curve, the Jacobian must have Mordell-Weil rank 1. In addition a routine Chabauty0 is provided for the easy case where the Jacobian has rank 0.

Brief description of Chabauty's method: Under the assumption that the rank of J = Jac(C) is strictly less than the genus of C, the closure V of J(Q) in J(Qp) (in the p-adic topology) can be described as the locus where certain power series vanish. The dimension of V is at most the rank of J(Q). The image of C in J (under a natural embedding) will intersect V in a finite set, and this set must contain C(Q). By examining the power series that define this finite intersection, one obtains upper bounds for the number of points on C(Q) in each congruence class modulo p (or any power of p).

Chabauty0(J) : JacHyp -> SetIndx
Given the Jacobian of a hyperelliptic curve C over Q, the function finds all rational points on C, under the assumption that J(Q) has rank zero.

The assumption is not checked. When it does not hold, the function computes a subset of C(Q) corresponding (in some sense) to the torsion in J(Q).

Chabauty(P : ptC) : JacHypPt -> SetIndx
    ptC: Pt                             Default: 
For a curve C of genus 2 over Q, this uses Chabauty's method combined with the Mordell-Weil sieve to find rational points on C. The argument P is a rational point of infinite order on the Jacobian J of C. The function returns the set of points on C whose images in J(Q) lie in the saturation in J(Q) of the group generated by P. In particular when J(Q) has rank 1, all rational points on C are returned.

The algorithm makes use of one rational point on the curve. Such a point may be supplied as the optional argument ptC; otherwise, the function attempts to find a point by searching (if it fails to find a point, a runtime error occurs). In particular, this routine cannot be used to show that a curve has no rational points.

Chabauty(P, p: Precision) : JacHypPt, RngIntElt -> SetIndx
    Precision: RngIntElt                Default: 5
Given a point on the Jacobian of a hyperelliptic curve C over Q, the function uses Chabauty's method (at the prime p) to bound the number of rational points on the curve C, The curve must have good reduction at the prime p, and the point P should generate a subgroup of index coprime to p in J(Q)/Jtors(Q). The algorithm assumes that C is in the simplified form y2 = f(x), where f has integral coefficients.

The function returns an indexed set of tuples < (x, z, v, k) > such that there are at most k pairs of rational points on C whose image in P1 under the x-coordinate map are congruent to (x:z) modulo pv, and such that the only rational points on C outside these congruences classes are Weierstrass points.

If the optional parameter Precision is supplied, then in the returned data each of the v's will be greater than or equal to Precision. (This might take some time because the algorithm is not optimised for this.)

Example CrvHyp_chabauty-method1 (H134E35)

In this example, which continues Example H134E25, we use

both implementations of Chabauty to prove that the curve y2=x6 + x2 + 2 has only the obvious six rational points.

> _<x> := PolynomialRing(Rationals());
> C := HyperellipticCurve(x^6+x^2+2);
> ptsC := Points(C : Bound:=1000); ptsC;
{@ (1 : -1 : 0), (1 : 1 : 0), (-1 : -2 : 1),
   (-1 : 2 : 1), (1 : -2 : 1), (1 : 2 : 1) @}
> J := Jacobian(C);
> RankBound(J);
1
So the Jacobian has rank at most 1. Next we ask whether any of the points on C give us points of infinite order on J.
> PJ1 := J! [ ptsC[3], ptsC[1] ];
> Order(PJ1);
8
> PJ2 := J! [ ptsC[5], ptsC[1] ];
> Order(PJ2);
0
This means PJ2 has infinite order in J(Q). In Example H134E25 we proved that PJ2 is not divisible in J(Q). Since J(Q) has rank 1, PJ2 is a generator of J(Q)/J(Q)tors.
> all_pts := Chabauty(PJ2); all_pts;
{ (1 : -2 : 1), (-1 : -2 : 1), (1 : 2 : 1),
  (1 : -1 : 0), (1 : 1 : 0), (-1 : 2 : 1) }
It still finds all points even if we do not give a generator for the free part: a "saturation" step is built in. Naturally, this takes slightly longer.
> okay := all_pts eq Chabauty(12*PJ2);
> assert okay; // Check that it is okay
So we find that we already had the full set of rational points on C. We could have reached the same conclusion using the other implementation of Chabauty, where we specify that the method be applied at the prime 3 (the most natural choice, since it is the smallest prime of good reduction).
> BadPrimes(C);
[ 2, 7 ]
> Chabauty(PJ2, 3);
{@ <1, 1, 4, 1>, <-1, 1, 4, 1>, <1, 0, 4, 1> @}
This tells us that there are at most 3 pairs of rational points on C, apart from Weierstrass points. In fact, one can easily check that there are no rational Weierstrass points. Therefore, the 6 known points are the only rational points on C.

Example CrvHyp_chabauty-method2 (H134E36)

In this example we show that there are precisely 6 rational points on the curve y2 = x6 + 8.
> _<x> := PolynomialRing(Rationals());
> C := HyperellipticCurve(x^6+8);
> ptsC := Points(C : Bound:= 1000); ptsC;
{@ (1 : -1 : 0), (1 : 1 : 0), (-1 : -3 : 1),
   (-1 : 3 : 1), (1 : -3 : 1), (1 : 3 : 1) @}
> J := Jacobian(C);
> PJ := J! [ ptsC[5], ptsC[1]];
> Order(PJ);
0
> RankBound(J);
1
This shows that J(Q) has rank 1, and PJ has infinite order. Now we check that PJ generates J(Q)/Jtors(Q), although this is not necessary. (For more explanation, see the similar calculation in Example H134E25).
> heightconst := HeightConstant(J : Effort:=2, Factor);
> LogarithmicBound := Height(PJ) + heightconst;  // Bound on h(Q)
> AbsoluteBound := Ceiling(Exp(LogarithmicBound));
> PtsUpToAbsBound := Points(J : Bound:=AbsoluteBound );
> ReducedBasis([ pt : pt in PtsUpToAbsBound ]);
[ (x^2 - x + 1, 3, 2) ]
[0.326617338771488428260076768590]
> Height(PJ);
0.326617338771488428260076768590
This shows there are no points in J(Q) with canonical height smaller than that of PJ, so PJ is a generator modulo torsion.
> all_pts := Chabauty(PJ : ptC:=ptsC[1]); all_pts;
{@ (1 : -1 : 0), (-1 : -3 : 1), (1 : 3 : 1),
   (-1 : 3 : 1), (1 : -3 : 1), (1 : 1 : 0) @}
> assert all_pts eq Chabauty(2*PJ : ptC:=ptsC[1]);

Example CrvHyp_chabauty-method4 (H134E37)

In Example H134E27 (in the section on 2-Selmer groups) we found a curve of rank 2. Although Chabauty's method cannot be applied to get information about the full set of rational points on C, we can still find all points on C whose images on J lie in a given subgroup of rank 1.
> _<x> := PolynomialRing(Rationals());
> C := HyperellipticCurve( x*(x+1344^2)*(x+10815^2)*(x+5406^2)*(x+2700^2) );
> J := Jacobian(C);
> ptsC := Points(C : Bound := 10^6); ptsC;
{@ (1 : 0 : 0), (0 : 0 : 1), (43264 : -44828581639628800 : 1),
   (43264 : 44828581639628800 : 1) @}
> PJ := J! [ ptsC[3], ptsC[1] ];
> Order(PJ);
0
Now consider the map from C into J that sends P to P - ptsC[1]. We call Chabauty to find all points P ∈C(Q) whose image lies in the saturated subgroup spanned by PJ.
> pts := Chabauty(PJ : ptC:=ptsC[1]); pts;
{ (1 : 0 : 0), (0 : 0 : 1), (-29224836 : 0 : 1),
  (-7290000 : 0 : 1), (-1806336 : 0 : 1), (-116964225 : 0 : 1),
  (43264 : 44828581639628800 : 1), (43264 : -44828581639628800 : 1) }
> assert #pts eq 8;

Example CrvHyp_chabauty-method3 (H134E38)

We find all rational points on C : y2 = x6 + 1. There are only finitely many rational points on the Jac(C) which means we may use Chabauty0.
> _<x> := PolynomialRing(Rationals());
> C := HyperellipticCurve(x^6+1);
> J := Jacobian(C);
> RankBound(J);
0
> Chabauty0(J);
{@ (1 : -1 : 0), (1 : 1 : 0), (0 : 1 : 1), (0 : -1 : 1) @}
The rank bound was obtained by computing the 2-Selmer group, which involved class group and unit computations in the fields given by roots of x6 + 1.

For this curve, there is an easier approach. There is an obvious map from C to the elliptic curve y2 = x3 + 1, which happens to have rank 0 over Q. To define the map, note that C lives in a weighted projective space where Y has weight 3.

> E := EllipticCurve([0,1]);
> Pr2<X,Y,Z> := Ambient(C);
> CtoE := map< C -> E | [X^2*Z,Y,Z^3] >;
The map is well-defined (Magma checks this by default). Now we find the rational points on E.
> Rank(E);
0
> #TorsionSubgroup(E);
6
> ptsE := Points(E : Bound:=100 ); ptsE;
{@ (0 : 1 : 0), (-1 : 0 : 1), (0 : 1 : 1),
   (0 : -1 : 1), (2 : 3 : 1), (2 : -3 : 1) @}
So, these are all the rational points on E. We can see with the naked eye that only those with X=0 pull back to rational points on C, giving us the same six points on C that we found before.

We may also ask Magma to pull them back:

> for P in ptsE do
>     preimageofP := P @@ CtoE;
>     Points(preimageofP);
> end for;
{@ (1 : -1 : 0), (1 : 1 : 0) @}
{@ @}
{@ (0 : 1 : 1) @}
{@ (0 : -1 : 1) @}
{@ @}
{@ @}
V2.28, 13 July 2023