Rational points on cubic curves
Which whole numbers are the area of a right-angled triangle whose three sides are rational? The triangle shows that is such a congruent number; the triangle with sides shows that is. The question appears in Arabic manuscripts of the tenth century, Fibonacci showed in 1225 that is congruent, and Fermat proved by infinite descent that is not congruent. A little algebra turns the question into geometry: is congruent exactly when the cubic curve
has a rational point with . (For the triangle gives the point : indeed .) A complete answer is still not known: Tunnell's theorem (1983) gives a simple criterion that decides the question — provided the Birch and Swinnerton-Dyer conjecture holds.
This is the pattern of the whole subject. Arithmetic geometry studies polynomial equations with integer or rational coefficients by looking at the geometry of their solution sets. For plane curves the geometry dictates the arithmetic with remarkable force:
- Conics (genus ) have either no rational points or a rational parametrisation by a line — infinitely many, all known (whether a point exists is decided by the Hasse–Minkowski local–global principle).
- Cubic curves with a rational point (genus , the elliptic curves) have rational points forming a finitely generated abelian group: finitely many points generate all the others by a chord-and-tangent construction (Mordell, 1922).
- Curves of genus at least have only finitely many rational points (Faltings, 1983).
Elliptic curves sit on the boundary between "parametrisable" and "finite", which is why they are so rich. They also connect three worlds that this lesson visits in turn: rational points (Mordell–Weil, the rank, Birch and Swinnerton-Dyer), points over finite fields (Hasse, Weil, Sato–Tate) and modular forms (the modularity theorem, and through it Fermat's Last Theorem). This lesson builds on algebraic number theory and algebraic geometry.
Chords, tangents and a group
Take a cubic curve and two rational points and on it. The line through them is defined over , and substituting it into the cubic gives a cubic equation in with rational coefficients. Two of its roots, and , are rational — so the third root is rational too, because the three roots add up to a rational coefficient. The third intersection point is a new rational point. (If , use the tangent line.)
Diophantus already used such tricks, and Bachet (1621) found that doubling a point of by the tangent turns into . Newton described the chord and tangent constructions geometrically. The decisive step came with Poincaré (1901): reflect the third point in the -axis and declare the result to be . With the "point at infinity" as zero, this is an abelian group law, and the arithmetic of the curve becomes the algebra of a group.
Three features of the picture organise everything that follows.
- Size. The coordinates of on Bachet's curve have denominators with digits — roughly proportional to . Heights grow quadratically, and this is what makes the group finitely generated.
- Reduction. Reducing the equation modulo a prime gives a curve over with about points. The errors carry deep information.
- Analysis. Packaging all the into one function links the finite fields back to the rational points: the conjecture of Birch and Swinnerton-Dyer.
Definitions
Throughout, is a field. When we write short equations we assume .
Definition— Weierstrass equation and elliptic curve
A Weierstrass equation over is
with associated quantities , , , and discriminant . An elliptic curve over is the projective curve defined by a Weierstrass equation with ; it consists of the affine solutions together with one point at infinity . When , a change of variables brings it to the short form , for which . Intrinsically, an elliptic curve is a smooth projective curve of genus with a chosen -rational point.
The condition says that the cubic has no repeated root, which is exactly the condition that the curve is smooth.
Definition— the group law
For , let be the third intersection point of the line (the tangent if ) with , counted with multiplicity, and define to be the third intersection of the line with . In short form, and . Explicitly, if , and , set
then and . The point is the zero, and .
Definition— Mordell–Weil group, rank and torsion
For a number field , is the Mordell–Weil group. By the Mordell–Weil theorem it is finitely generated, so with finite; is the rank of over .
Definition— reduction, the trace of Frobenius and the L-function
Let be given by a Weierstrass equation with integer coefficients and minimal discriminant . For a prime the reduced equation defines an elliptic curve over (good reduction), and we put . For the reduction is singular, and according as it has a node with rational tangents (split multiplicative), a node with conjugate tangents (non-split multiplicative), or a cusp (additive). The conductor is a product of the bad primes, to the first power exactly at multiplicative primes. The L-function is
which converges for by the Hasse bound below.
Definition— modular elliptic curve
of conductor is modular if there is a weight- cuspidal newform for with , that is, for every prime . (Equivalently, there is a non-constant map defined over .)
Examples and non-examples
Example— A point of order six
On (discriminant ) take . The tangent at has slope , so and . Chords then give
so has order . Every multiple is integral, as the Nagell–Lutz theorem below requires of torsion points, and has : it is a point of order . In fact .
Example— A point of infinite order
On Bachet's curve , and . Since is not integral, it is not a torsion point (Nagell–Lutz), so neither is . The rank of this curve is and generates .
Example— The congruent number curves
. Its points of order are and , and one can show that these, with , are all the torsion. So is congruent if and only if has positive rank. For the rank is (Fermat's descent), for the point has infinite order (check: ), and for the point comes from the triangle.
Example— Counting points over a small field
Take over (here ). The squares mod are . For the right-hand side is , which has square roots. So there are affine points and , inside the Hasse interval , with . A group of order is or ; the second would need all of to be rational, and the Weil pairing would then force to contain the cube roots of unity, which it does not (). So .
Example— Curves of rank 0, 1, 2 and 3
From Cremona's tables, labelled by conductor: has rank (and ); has rank , generated by , and discriminant ; has rank ; has rank . Each is the curve of smallest conductor with its rank. The computation section repeats Birch and Swinnerton-Dyer's experiment on these four.
Example— Non-examples: singular cubics
has : it has a cusp at the origin. Its non-singular points still form a group under the chord rule, but identifies that group with . Similarly has a node, and its non-singular points form a group isomorphic to (when the tangents at the node are rational). These degenerate "elliptic curves" are exactly what appears at primes of multiplicative and additive reduction.
Central results
Theorem— Theorem 1 (the group law)
Let be an elliptic curve over (). The chord-and-tangent rule makes an abelian group with identity and .
Proof
Closure. Let , with and slope as in the definition, so . Substituting the line into the equation gives
a monic cubic with coefficients in that vanishes at and . Hence with (Vieta), so , and satisfies the equation because . If with , the tangent line with makes a double root of (as ), and the same argument gives . In the remaining cases (, ) the line is vertical, meets again at , and . Reflection preserves the equation, so .
Identity, inverses, commutativity. The line through and is the vertical line through ; its third point is , and reflecting gives . The line through and is vertical, so . The line through and does not depend on their order, so .
Associativity is the one non-trivial axiom. It can be verified by a long computation with the formulas (computer algebra does it in seconds), but the conceptual proof identifies with the degree-zero Picard group: is a bijection by the Riemann–Roch theorem, and the chord rule is the statement that exactly when is the divisor of a line, a principal divisor. So the group law is transported from a group (Silverman, The Arithmetic of Elliptic Curves, III.3.4). Mathlib uses an algebraic version of this idea; see the formal section.
∎
Theorem— Proposition 2 (points of order two)
A point satisfies if and only if . Over an algebraic closure there are exactly three such points, for the three roots of , and .
Proof
means , i.e. , i.e. (as ). The points with are the with , and the three roots are distinct because . With these form a group of order in which every element has order at most , so it is .
∎
Theorem— Theorem 3 (Nagell 1935, Lutz 1937; Mazur 1977)
Let with . If is a torsion point, then , and either or . Moreover (Mazur) is isomorphic to one of the fifteen groups for or , and for .
Nagell–Lutz is proved with the formal group (or by valuations of denominators) in Silverman–Tate, Chapter 2; it makes torsion computable: only finitely many candidates need testing. Mazur's theorem is much deeper (it rests on the arithmetic of the modular curves and ).
Theorem— Theorem 4 (Mordell 1922; Weil 1928)
For an elliptic curve over a number field , the group is finitely generated.
The proof has two halves. The weak Mordell–Weil theorem says that is finite. Over , a Kummer map embeds into , landing in the classes that are unramified outside a finite set of primes; that group is finite by the finiteness of the class group and Dirichlet's -unit theorem, and finiteness over implies finiteness over . The descent half uses a height function and is purely group-theoretic; we prove it in full.
Theorem— Lemma 5 (the descent lemma)
Let be an abelian group and a function such that (i) for every the set is finite; (ii) there is a constant with for all ; (iii) is finite. Then is finitely generated.
Proof
Choose representatives of the cosets of and let . Taking in (ii) gives , and (ii) also gives . Now let and write . Then
so with . Repeating, with
For large . Hence is generated by together with the set , which is finite by (i).
∎
For one takes the naïve height , where in lowest terms over (with the analogous product over places for number fields). Property (i) holds because there are finitely many rationals of bounded height, and (ii), the approximate parallelogram law, is a careful estimate with the duplication formula. The limit is the canonical height, an exact quadratic form on : this is the quadratic growth seen on Bachet's curve.
Theorem— Theorem 6 (Hasse 1933)
For an elliptic curve over , .
Proof
We use two standard facts about the endomorphism ring of over (Silverman III.6 and V.1). Let be the Frobenius endomorphism; its fixed points are exactly , so .
- The degree map is a positive definite quadratic form: , with equality only for , and is bilinear. Also .
- is separable (its differential is ), so .
Put and . By fact 1, for all integers ,
A binary quadratic form that is non-negative on is non-negative on (scale) and hence on (continuity), so its discriminant is : , that is .
∎
The same computation gives more. satisfies in ; if are the roots of (complex conjugates of absolute value ), then for every , and the zeta function
is rational, satisfies a functional equation under , and has its zeros on — the Riemann hypothesis for . For over , , so .
Theorem— Theorem 7 (the Weil conjectures; Weil, Dwork, Grothendieck, Deligne)
For a smooth projective variety of dimension over , the zeta function is a rational function satisfying a functional equation, and the reciprocal roots of have absolute value . If lifts to characteristic , is the -th Betti number of the complex variety.
Weil proved the case of curves (1940s); Dwork proved rationality (1960); Grothendieck and his school built -adic cohomology, which gives rationality and the functional equation via a Lefschetz trace formula; Deligne proved the Riemann hypothesis (1974). For an elliptic curve, has rank and Frobenius acts on it with eigenvalues : Hasse's theorem is the case , .
Theorem— Theorem 8 (modularity; Wiles 1995, Taylor–Wiles 1995, Breuil–Conrad–Diamond–Taylor 2001)
Every elliptic curve over is modular. Consequently has an analytic continuation to all of and satisfies the functional equation , where .
Wiles (with Taylor–Wiles for a key step) proved the theorem for semistable curves, those with only multiplicative bad reduction; Breuil, Conrad, Diamond and Taylor completed the general case. Example: for , , a weight- cusp form for ; the Langlands lesson checks this numerically.
Theorem— Corollary 9 (Fermat's Last Theorem)
For there are no positive integers with .
The route, in outline. It suffices to treat (Fermat) and odd primes ( is Euler's case). Given a solution with coprime, suitably normalised, Frey (1984–86) considered
whose discriminant is : it is semistable, and its -torsion is "too lightly ramified". Ribet's theorem (1986–90, proving Serre's -conjecture) then says that if were modular of level , its -torsion would come from a weight- newform of level . There are no such forms (the space is zero). So is not modular, contradicting Wiles's theorem for semistable curves.
Theorem— Conjecture 10 (Birch and Swinnerton-Dyer, 1960s)
For , the order of vanishing of at equals the rank of , and
where is the real period, the determinant of the canonical height pairing on a basis of , the Tamagawa numbers, and the Tate–Shafarevich group (conjecturally finite).
The heuristic behind it: is formally . If has many rational points, they reduce to many points mod , the are on average a little larger than , and the product is pulled towards . Birch and Swinnerton-Dyer computed on the EDSAC-2 computer at Cambridge and saw growth like .
The landscape: what is known, what is open
Established theorems.
- Rank 0 and 1. If the analytic rank is or , then it equals the rank and Ш is finite: Gross–Zagier (1986) constructed Heegner points whose height is up to a non-zero factor, Kolyvagin (1988–89) bounded Selmer groups with Euler systems, and modularity (Theorem 8) removes the hypothesis they needed. Earlier, Coates and Wiles (1977) proved that implies finite for curves with complex multiplication.
- Averages. Ordering curves by height, Bhargava and Shankar (2010s) proved that the average rank is bounded (by , using -Selmer groups); a positive proportion of curves have rank and a positive proportion rank ; and Bhargava, Skinner and Zhang (2014) deduced that a majority of elliptic curves over satisfy the rank part of BSD.
- Congruent numbers. Tian Ye (2014) proved that for every there are infinitely many square-free congruent numbers with exactly prime factors.
- Sato–Tate. For without complex multiplication the angles in are equidistributed with density : proved by Clozel, Harris, Shepherd-Barron and Taylor (2008) when , and by Barnet-Lamb, Geraghty, Harris and Taylor (2011) in general.
- Higher genus. Faltings (1983) proved Mordell's conjecture: a curve of genus over a number field has finitely many rational points. The proof is not effective: it bounds the number of points but gives no algorithm to find them all.
Open problems.
- The Birch and Swinnerton-Dyer conjecture — open for analytic rank , and the full leading-term formula is open in general even in ranks and (it is known for many individual curves). It is one of the Clay Millennium Problems.
- Finiteness of Ш — known when the analytic rank is at most , open in general.
- Computing the rank. No algorithm is known that provably computes the rank of every ; descent algorithms terminate if Ш is finite (or if BSD holds), which is why they work in practice.
- Boundedness of ranks. Curves of rank at least are known (Elkies, 2006). Whether ranks over are bounded is open; the heuristics of Park, Poonen, Voight and Wood (2019) predict that only finitely many curves have rank greater than .
- Uniformity. Is the number of rational points on curves of genus bounded in terms of and the rank of the Jacobian alone? Major progress came in 2020–21 (Dimitrov, Gao and Habegger; Kühne), but effective versions remain open.
Elliptic curves in Lean and Mathlib
Mathlib has Weierstrass curves over any commutative ring, their discriminants and -invariants, nonsingular points, the group of points of an elliptic curve over a field, reduction, naïve heights and the formal -function of a curve over a number field. We formalise the algebra of the lesson and connect it to these definitions.
The discriminant of the short form, from Mathlib's general formula:
/-- For a short Weierstrass equation `y² = x³ + a₄x + a₆` (so `a₁ = a₂ = a₃ = 0`), Mathlib's
general discriminant `Δ = −b₂²b₈ − 8b₄³ − 27b₆² + 9b₂b₄b₆` simplifies to
`Δ = −16(4a₄³ + 27a₆²)`. So the curve is smooth exactly when `4a³ + 27b² ≠ 0` (away from
characteristic 2). Proof: unfold `b₂, b₄, b₆, b₈` and compute. -/
theorem short_discriminant {R : Type*} [CommRing R] (W : WeierstrassCurve R)
(h₁ : W.a₁ = 0) (h₂ : W.a₂ = 0) (h₃ : W.a₃ = 0) :
W.Δ = -16 * (4 * W.a₄ ^ 3 + 27 * W.a₆ ^ 2) := by
simp only [Δ, b₂, b₄, b₆, b₈, h₁, h₂, h₃]
ringThe closure step of Theorem 1. The Lean proof follows the human one with the Vieta argument unwound: subtracting the two curve equations and cancelling solves for , the first equation solves for , and what remains is a polynomial identity.
/-- **The chord construction.** Let `P₁ = (x₁, y₁)` and `P₂ = (x₂, y₂)` lie on
`y² = x³ + ax + b` with `x₁ ≠ x₂`, and let `ℓ` be the slope of the chord, `y₂ − y₁ = ℓ(x₂ − x₁)`.
Then the point with `x₃ = ℓ² − x₁ − x₂` and `y₃ = ℓ(x₃ − x₁) + y₁` — the third intersection of
the chord with the curve — lies on the curve. (Its reflection `(x₃, −y₃)` is `P₁ + P₂`.)
Proof, as in the lesson: subtracting the two curve equations and cancelling `x₂ − x₁` expresses
`a` through the chord; the first equation expresses `b`; after substituting, the claim is a
polynomial identity — Vieta's formula `x₁ + x₂ + x₃ = ℓ²` in disguise. -/
theorem chord_third_point {F : Type*} [Field F] {a b x₁ y₁ x₂ y₂ ℓ : F}
(h₁ : y₁ ^ 2 = x₁ ^ 3 + a * x₁ + b) (h₂ : y₂ ^ 2 = x₂ ^ 3 + a * x₂ + b)
(hx : x₁ ≠ x₂) (hℓ : y₂ - y₁ = ℓ * (x₂ - x₁)) :
(ℓ * ((ℓ ^ 2 - x₁ - x₂) - x₁) + y₁) ^ 2 =
(ℓ ^ 2 - x₁ - x₂) ^ 3 + a * (ℓ ^ 2 - x₁ - x₂) + b := by
have hy₂ : y₂ = y₁ + ℓ * (x₂ - x₁) := by linear_combination hℓ
-- `h₂ − h₁`, factorised: `(x₂ − x₁) · (ℓ(2y₁ + ℓ(x₂ − x₁)) − (x₂² + x₁x₂ + x₁² + a)) = 0`.
have key : (x₂ - x₁) *
(ℓ * (2 * y₁ + ℓ * (x₂ - x₁)) - (x₂ ^ 2 + x₁ * x₂ + x₁ ^ 2 + a)) = 0 := by
rw [hy₂] at h₂
linear_combination h₂ - h₁
have hne : x₂ - x₁ ≠ 0 := sub_ne_zero.mpr (Ne.symm hx)
have ha : a = ℓ * (2 * y₁ + ℓ * (x₂ - x₁)) - (x₂ ^ 2 + x₁ * x₂ + x₁ ^ 2) := by
have := (mul_eq_zero.mp key).resolve_left hne
linear_combination -this
have hb : b = y₁ ^ 2 - x₁ ^ 3 - a * x₁ := by linear_combination -h₁
rw [hb, ha]
ring/-- **The tangent construction.** If `P₁ = (x₁, y₁)` lies on `y² = x³ + ax + b` and `ℓ` is the
slope of the tangent there, `2y₁ℓ = 3x₁² + a` (implicit differentiation), then the point with
`x₃ = ℓ² − 2x₁` and `y₃ = ℓ(x₃ − x₁) + y₁` lies on the curve; its reflection is `2P₁`.
The tangent meets the curve at `P₁` twice, so Vieta now reads `2x₁ + x₃ = ℓ²`. -/
theorem tangent_third_point {F : Type*} [Field F] {a b x₁ y₁ ℓ : F}
(h₁ : y₁ ^ 2 = x₁ ^ 3 + a * x₁ + b) (hℓ : 2 * y₁ * ℓ = 3 * x₁ ^ 2 + a) :
(ℓ * ((ℓ ^ 2 - 2 * x₁) - x₁) + y₁) ^ 2 =
(ℓ ^ 2 - 2 * x₁) ^ 3 + a * (ℓ ^ 2 - 2 * x₁) + b := by
have ha : a = 2 * y₁ * ℓ - 3 * x₁ ^ 2 := by linear_combination -hℓ
have hb : b = y₁ ^ 2 - x₁ ^ 3 - a * x₁ := by linear_combination -h₁
rw [hb, ha]
ringMathlib's general formula, for any Weierstrass equation, and associativity. Mathlib's proof of associativity (Angdinata and Xu, 2023) is elementary but not computational: it sends each point to the class of its ideal in the coordinate ring , shows that this map into the ideal class group is injective and turns the chord rule into multiplication — an algebraic avatar of the map in the proof of Theorem 1.
/-- Mathlib's general version, for any Weierstrass equation
`y² + a₁xy + a₃y = x³ + a₂x² + a₄x + a₆` over a field: unless `P₂ = −P₁`, the point
`(addX, addY)` built from the chord (or tangent) slope `W.slope` lies on the curve.
This applies `WeierstrassCurve.Affine.equation_add`. -/
theorem sum_on_curve {F : Type*} [Field F] [DecidableEq F] (W : WeierstrassCurve F)
{x₁ x₂ y₁ y₂ : F} (h₁ : W.toAffine.Equation x₁ y₁) (h₂ : W.toAffine.Equation x₂ y₂)
(hxy : ¬(x₁ = x₂ ∧ y₁ = W.toAffine.negY x₂ y₂)) :
W.toAffine.Equation (W.toAffine.addX x₁ x₂ (W.toAffine.slope x₁ x₂ y₁ y₂))
(W.toAffine.addY x₁ x₂ y₁ (W.toAffine.slope x₁ x₂ y₁ y₂)) :=
Affine.equation_add h₁ h₂ hxy/-- The chord-and-tangent law is **associative**. This is the one genuinely hard group axiom;
Mathlib proves it (D. K. Angdinata and J. Xu) not by the classical page of algebra but by
showing that `P ↦ [ideal of P]` is an injective map into the ideal class group of the
coordinate ring `F[x, y]/(W)` that turns `+` into multiplication of ideal classes — so the
points inherit associativity from a group. This applies `add_assoc` for the instance
`AddCommGroup W.toAffine.Point`. -/
theorem add_assoc_points {F : Type*} [Field F] [DecidableEq F] (W : WeierstrassCurve F)
(P Q R : W.toAffine.Point) : P + Q + R = P + (Q + R) :=
add_assoc P Q R/-- On a curve `y² + a₂… = x³ + …` with `a₁ = a₃ = 0` (for instance a short Weierstrass curve),
a point with `y = 0` is its own negative, so `P + P = 0`: the points of order 2 are the
roots of the cubic. This applies `WeierstrassCurve.Affine.Point.add_self_of_Y_eq`, since
`negY x 0 = −0 − a₁x − a₃ = 0`. -/
theorem two_torsion {F : Type*} [Field F] [DecidableEq F] (W : WeierstrassCurve F)
(h₁ : W.a₁ = 0) (h₃ : W.a₃ = 0) {x : F} (h : W.toAffine.Nonsingular x 0) :
(Affine.Point.some x 0 h + Affine.Point.some x 0 h : W.toAffine.Point) = 0 :=
Affine.Point.add_self_of_Y_eq (by simp [Affine.negY, h₁, h₃])The worked examples, computed in Lean with Mathlib's addition law: the point of order six, Bachet's duplication and the curve .
/-- The curve `y² = x³ + 1` over `ℚ`, with Weierstrass coefficients
`(a₁, a₂, a₃, a₄, a₆) = (0, 0, 0, 0, 1)`. Its discriminant is `−16 · 27 = −432`. -/
def torsionCurve : WeierstrassCurve ℚ := ⟨0, 0, 0, 0, 1⟩/-- The rational point `P = (2, 3)` on `y² = x³ + 1` (indeed `9 = 8 + 1`), as an element of the
group of points. The proof obligation is that `(2, 3)` is a nonsingular point of the curve. -/
noncomputable def torsionPoint : torsionCurve.toAffine.Point :=
.some 2 3 (by
rw [Affine.nonsingular_iff]
norm_num [torsionCurve, Affine.Equation, Affine.evalEval_polynomial])/-- `P = (2, 3)` has **order exactly 6** on `y² = x³ + 1`. Lean computes the multiples with
Mathlib's addition law, exactly as in the lesson's table:
`2P = (0, 1)`, `3P = (−1, 0)`, `4P = (0, −1)`, `5P = (2, −3) = −P`, `6P = 0`;
none of `P, …, 5P` is the point at infinity, so the order is 6. (Mazur's theorem says that
torsion orders over `ℚ` are at most 12; this is one of the possible groups, `ℤ/6`.) -/
theorem torsion_order_six : addOrderOf torsionPoint = 6 := by
have n2 : torsionCurve.toAffine.Nonsingular 0 1 := by
rw [Affine.nonsingular_iff]; norm_num [torsionCurve, Affine.Equation, Affine.evalEval_polynomial]
have n3 : torsionCurve.toAffine.Nonsingular (-1) 0 := by
rw [Affine.nonsingular_iff]; norm_num [torsionCurve, Affine.Equation, Affine.evalEval_polynomial]
have n4 : torsionCurve.toAffine.Nonsingular 0 (-1) := by
rw [Affine.nonsingular_iff]; norm_num [torsionCurve, Affine.Equation, Affine.evalEval_polynomial]
have n5 : torsionCurve.toAffine.Nonsingular 2 (-3) := by
rw [Affine.nonsingular_iff]; norm_num [torsionCurve, Affine.Equation, Affine.evalEval_polynomial]
-- the tangent at `P` has slope `3·2²/(2·3) = 2`
have h2 : (2 : ℕ) • torsionPoint = .some 0 1 n2 := by
rw [two_nsmul, torsionPoint, Affine.Point.add_self_of_Y_ne (by
simp [torsionCurve, Affine.negY]; norm_num)]
simp [torsionCurve, Affine.addY, Affine.negY]
norm_num
-- chords: `(0, 1) + P`, `(−1, 0) + P`, `(0, −1) + P`
have h3 : (3 : ℕ) • torsionPoint = .some (-1) 0 n3 := by
rw [succ_nsmul, h2, torsionPoint, Affine.Point.add_of_X_ne (by norm_num)]
simp [torsionCurve, Affine.addY, Affine.negY]
norm_num
have h4 : (4 : ℕ) • torsionPoint = .some 0 (-1) n4 := by
rw [succ_nsmul, h3, torsionPoint, Affine.Point.add_of_X_ne (by norm_num)]
simp [torsionCurve, Affine.addY, Affine.negY]
norm_num
have h5 : (5 : ℕ) • torsionPoint = .some 2 (-3) n5 := by
rw [succ_nsmul, h4, torsionPoint, Affine.Point.add_of_X_ne (by norm_num)]
simp [torsionCurve, Affine.addY, Affine.negY]
norm_num
-- `5P = −P`, so `6P = 0`
have h6 : (6 : ℕ) • torsionPoint = 0 := by
rw [succ_nsmul, h5, torsionPoint, Affine.Point.add_of_Y_eq rfl]
simp [torsionCurve, Affine.negY]
rw [addOrderOf_eq_iff (by norm_num)]
refine ⟨h6, fun m hm hm0 => ?_⟩
interval_cases m
· rw [one_nsmul, torsionPoint]; exact Affine.Point.some_ne_zero _
· rw [h2]; exact Affine.Point.some_ne_zero _
· rw [h3]; exact Affine.Point.some_ne_zero _
· rw [h4]; exact Affine.Point.some_ne_zero _
· rw [h5]; exact Affine.Point.some_ne_zero _/-- Bachet's curve `y² = x³ − 2` over `ℚ`: coefficients `(0, 0, 0, 0, −2)`. -/
def bachetCurve : WeierstrassCurve ℚ := ⟨0, 0, 0, 0, -2⟩/-- **Bachet's duplication (1621).** On `y² = x³ − 2`, doubling the point `(3, 5)` with the
tangent (slope `3·3²/(2·5) = 27/10`) gives `(129/100, −383/1000)`: a new rational solution from
an old one. (`(3, 5)` has infinite order — its double is not integral, so by the
Nagell–Lutz theorem it is not torsion — but that argument is not formalised here.) -/
theorem bachet_duplication :
∃ (h : bachetCurve.toAffine.Nonsingular 3 5)
(h' : bachetCurve.toAffine.Nonsingular (129 / 100) (-383 / 1000)),
Affine.Point.some 3 5 h + Affine.Point.some 3 5 h = Affine.Point.some _ _ h' := by
have h : bachetCurve.toAffine.Nonsingular 3 5 := by
rw [Affine.nonsingular_iff]; norm_num [bachetCurve, Affine.Equation, Affine.evalEval_polynomial]
have h' : bachetCurve.toAffine.Nonsingular (129 / 100) (-383 / 1000) := by
rw [Affine.nonsingular_iff]; norm_num [bachetCurve, Affine.Equation, Affine.evalEval_polynomial]
refine ⟨h, h', ?_⟩
rw [Affine.Point.add_self_of_Y_ne (by simp [bachetCurve, Affine.negY]; norm_num)]
simp [bachetCurve, Affine.addY, Affine.negY]
norm_num/-- The curve `37a1`: `y² + y = x³ − x`, coefficients `(0, 0, 1, −1, 0)`. It has conductor 37
and rank 1, with `E(ℚ)` generated by `(0, 0)`; it is the first curve in Cremona's tables of
positive rank. -/
def curve37a : WeierstrassCurve ℚ := ⟨0, 0, 1, -1, 0⟩/-- The discriminant of `y² + y = x³ − x` is `37`, so the curve has good reduction at every
prime except 37. (Proof: unfold `Δ` in terms of `b₂, b₄, b₆, b₈` and compute.) -/
theorem curve_37a_discriminant : curve37a.Δ = 37 := by
simp only [curve37a, Δ, b₂, b₄, b₆, b₈]
norm_numPoint counts over , and an exhaustive kernel check of the Hasse bound for every curve over — a finite verification, clearly weaker than Theorem 6:
/-- The number of points of `y² = x³ + ax + b` over `𝔽_p`, computed naively: for each `x` and `y`
in `{0, …, p − 1}`, test `y² ≡ x³ + ax + b (mod p)`, then add one for the point at infinity.
(Plain natural-number arithmetic, so that the kernel can evaluate it with `decide`.) -/
def pointCount (p a b : ℕ) : ℕ :=
((List.range p).map fun x =>
((List.range p).filter fun y => (y * y) % p = (x ^ 3 + a * x + b) % p).length).sum + 1/-- **The Hasse bound, checked exhaustively for small primes.** For `p ∈ {5, 7, 11, 13}` and
every `a, b ∈ 𝔽_p` with `4a³ + 27b² ≠ 0`, the curve `y² = x³ + ax + b` has
`(#E(𝔽_p) − (p + 1))² ≤ 4p`, i.e. `|#E(𝔽_p) − (p + 1)| ≤ 2√p`. The kernel evaluates all
`25 + 49 + 121 + 169` cases (`decide`). This is a finite verification, not Hasse's theorem,
which is not yet in Mathlib. -/
theorem hasse_small_primes : ∀ p ∈ [5, 7, 11, 13], ∀ a < p, ∀ b < p,
(4 * a ^ 3 + 27 * b ^ 2) % p ≠ 0 → ((pointCount p a b : ℤ) - (p + 1)) ^ 2 ≤ 4 * p := by
decideMordell–Weil. Mathlib (work of M. Stoll and collaborators, 2026) contains the descent lemma, the naïve height with its approximate parallelogram law, and the Northcott property for number fields. So both the finiteness of torsion and the descent half of Theorem 4 are formal theorems; what is missing is the weak Mordell–Weil theorem.
/-- The torsion subgroup of `E(ℚ)` is finite, for every elliptic curve over `ℚ`. Mathlib proves
this (M. Stoll) for any field with the Northcott property, using the naïve height and its
approximate parallelogram law. This applies `WeierstrassCurve.Affine.finite_torsion`. -/
theorem torsion_finite (W : WeierstrassCurve ℚ) [W.IsElliptic] :
Finite (AddCommGroup.torsion W.toAffine.Point) :=
Affine.finite_torsion/-- **Mordell–Weil, minus the weak theorem.** For an elliptic curve over a number field `K`:
if `2E(K)` has finite index in `E(K)` (the *weak* Mordell–Weil theorem), then `E(K)` is a
finitely generated abelian group. This is the descent half of the classical proof, assembled
from Mathlib's descent theorem `AddCommGroup.fg_of_descent'`, the non-negativity of heights, the
approximate parallelogram law `WeierstrassCurve.Affine.approx_parallelogram_law`, and the
Northcott property of number fields. The weak theorem itself (finiteness of `E(K)/2E(K)`,
proved with the finiteness of class groups and unit theorems) is not yet in Mathlib. -/
theorem mordell_weil_of_weak {K : Type*} [Field K] [NumberField K] [DecidableEq K]
(W : WeierstrassCurve K) [W.IsElliptic]
(hweak : (nsmulAddMonoidHom (α := W.toAffine.Point) 2).range.FiniteIndex) :
AddGroup.FG W.toAffine.Point := by
obtain ⟨C, hC⟩ := Affine.approx_parallelogram_law (W := W.toAffine)
exact AddCommGroup.fg_of_descent' hweak (fun P => by
rw [Affine.Point.naiveHeight_eq_logHeight]; exact Height.logHeight_nonneg _) hCFermat's Last Theorem for exponents and is in Mathlib, by elementary methods:
/-- Fermat's Last Theorem for exponent 3: no positive integers satisfy `a³ + b³ = c³`
(Euler, with gaps later filled). This applies Mathlib's `fermatLastTheoremThree`. -/
theorem flt_three : FermatLastTheoremFor 3 := fermatLastTheoremThree/-- Fermat's Last Theorem for exponent 4, by Fermat's method of infinite descent (in fact
`a⁴ + b⁴ = c²` has no positive solutions). This applies Mathlib's `fermatLastTheoremFour`.
The general case follows from the modularity of semistable elliptic curves (Wiles,
Taylor–Wiles, 1995) via Frey curves and Ribet's theorem; that proof is not in Mathlib, and a
collaborative project led by Kevin Buzzard to formalise it in Lean began in 2024. -/
theorem flt_four : FermatLastTheoremFor 4 := fermatLastTheoremFourWhat is and is not formalised. Formalised here or in Mathlib: Weierstrass curves, discriminants, the group law with associativity, the closure computation, finiteness of torsion over number fields, the descent step of Mordell–Weil, the worked examples, finite checks of the Hasse bound, FLT for . Not formalised: weak Mordell–Weil (hence Mordell–Weil), Nagell–Lutz and Mazur, Hasse's theorem in general and the Weil conjectures, modularity and FLT in general (a large collaborative project led by Kevin Buzzard began formalising FLT in Lean in 2024), and of course BSD, which is a conjecture.
Computing with points
The first experiment implements the group law with exact fractions. It recomputes the table of multiples of on , follows the multiples of Bachet's point — whose denominators grow so that the number of digits divided by settles near a constant, a shadow of the canonical height — and checks associativity on every triple of points of a curve over .
"""The chord-and-tangent group law over the rationals, in exact arithmetic.
We implement addition on a short Weierstrass curve y^2 = x^3 + a x + b with
Fraction arithmetic (None is the point at infinity, the identity). Then:
1. On y^2 = x^3 + 1 the point P = (2, 3) has order 6: its multiples are listed
and every one has integer coordinates, as the Nagell-Lutz theorem demands
of torsion points.
2. On Bachet's curve y^2 = x^3 - 2 the point P = (3, 5) has infinite order:
2P is not integral, so (Nagell-Lutz) 2P is not torsion, hence neither is P.
The number of digits of the denominators of nP grows roughly like n^2, the
signature of the canonical height.
3. Associativity, the hard axiom, is checked on every triple of points of a
curve over the finite field F_13 (exhaustive for that curve).
All arithmetic is exact. The order-6 computation is a complete proof for that
point; the associativity check covers one finite curve only.
"""
from fractions import Fraction
import itertools
def on_curve(P, a, b):
"""True if P is the point at infinity or satisfies y^2 = x^3 + a x + b."""
if P is None:
return True
x, y = P
return y * y == x ** 3 + a * x + b
def neg(P):
"""The negative of a point: reflect in the x-axis."""
return None if P is None else (P[0], -P[1])
def add(P, Q, a):
"""Chord-and-tangent addition on y^2 = x^3 + a x + b (b is not needed)."""
if P is None:
return Q
if Q is None:
return P
(x1, y1), (x2, y2) = P, Q
if x1 == x2 and y1 == -y2:
return None # vertical line: P + (-P) = O
if x1 == x2:
slope = (3 * x1 * x1 + a) / (2 * y1) # tangent
else:
slope = (y2 - y1) / (x2 - x1) # chord
x3 = slope * slope - x1 - x2
y3 = slope * (x3 - x1) + y1 # third intersection point
return (x3, -y3) # reflect it
def multiple(n, P, a):
"""n * P for n >= 0, by repeated addition."""
R = None
for _ in range(n):
R = add(R, P, a)
return R
def order(P, a, limit=20):
"""The order of P if it is at most `limit`, otherwise None."""
R = P
for n in range(1, limit + 1):
if R is None:
return n
R = add(R, P, a)
return None
def is_integral(P):
"""True for the point at infinity or a point with integer coordinates."""
return P is None or (P[0].denominator == 1 and P[1].denominator == 1)
def add_mod(P, Q, a, p):
"""The same chord-and-tangent formulas over the field Z/pZ (p prime > 3)."""
if P is None:
return Q
if Q is None:
return P
(x1, y1), (x2, y2) = P, Q
if x1 == x2 and (y1 + y2) % p == 0:
return None
if x1 == x2:
slope = (3 * x1 * x1 + a) * pow(2 * y1, -1, p) % p
else:
slope = (y2 - y1) * pow(x2 - x1, -1, p) % p
x3 = (slope * slope - x1 - x2) % p
y3 = (slope * (x3 - x1) + y1) % p
return (x3, -y3 % p)
def points_mod(a, b, p):
"""All points of y^2 = x^3 + a x + b over Z/pZ, the point at infinity first."""
return [None] + [(x, y) for x in range(p) for y in range(p)
if (y * y - x ** 3 - a * x - b) % p == 0]
def associativity_failures(points, a, p):
"""Triples (P, Q, R) of points over Z/pZ with (P + Q) + R != P + (Q + R)."""
bad = []
for P, Q, R in itertools.product(points, repeat=3):
if add_mod(add_mod(P, Q, a, p), R, a, p) != add_mod(P, add_mod(Q, R, a, p), a, p):
bad.append((P, Q, R))
return bad
def fmt(P):
"""Short text for a point."""
return "O" if P is None else f"({P[0]}, {P[1]})"
def main():
F = Fraction
print("1. y^2 = x^3 + 1, P = (2, 3):")
P = (F(2), F(3))
for n in range(1, 7):
print(f" {n}P = {fmt(multiple(n, P, 0))}")
print(f" order of P = {order(P, 0)}; all multiples integral: "
f"{all(is_integral(multiple(n, P, 0)) for n in range(1, 7))}")
print()
print("2. Bachet's curve y^2 = x^3 - 2, P = (3, 5):")
a, b = F(0), F(-2)
Q = (F(3), F(5))
print(f" 2P = {fmt(multiple(2, Q, a))} (not integral, so P has")
print(" infinite order by Nagell-Lutz)")
print(" n digits of denominator of x(nP) ratio to n^2")
R = None
for n in range(1, 11):
R = add(R, Q, a)
assert on_curve(R, a, b)
d = len(str(R[0].denominator))
print(f" {n:2d} {d:30d} {d / n ** 2:12.2f}")
print()
pts = points_mod(2, 3, 13)
bad = associativity_failures(pts, 2, 13)
print(f"3. y^2 = x^3 + 2x + 3 over F_13 has {len(pts)} points; "
f"associativity fails")
print(f" for {len(bad)} of all {len(pts) ** 3} triples.")
print()
print("Epistemic status: exact arithmetic. Part 1 is a complete")
print("computation of the order of (2, 3); that (3, 5) has infinite order")
print("rests on the Nagell-Lutz theorem, quoted, not proved here. Part 3 is")
print("exhaustive for one curve over one field; associativity in general is")
print("a theorem (proved in the references, and in Mathlib).")
if __name__ == "__main__":
main()The second experiment counts points of , , and over for all . It checks the Hasse bound, compares the Sato–Tate angles of with the density , and recomputes Birch and Swinnerton-Dyer's products .
"""Counting points over finite fields: Hasse, Sato-Tate and Birch-Swinnerton-Dyer.
For an elliptic curve E over Q with integer coefficients and a prime p, let
N_p be the number of points of E over F_p (including the point at infinity)
and a_p = p + 1 - N_p. We count points exactly for all p below a bound and
1. check Hasse's bound |a_p| <= 2 sqrt(p) (a theorem; here a finite check);
2. compare the angles theta_p in a_p = 2 sqrt(p) cos(theta_p) with the
Sato-Tate density (2/pi) sin^2(theta) (a theorem for curves like 37a1,
proved 2008-2011; here a small sample);
3. repeat Birch and Swinnerton-Dyer's 1960s experiment: the partial products
prod_{p <= X} N_p / p for curves of rank 0, 1, 2 and 3. Their conjecture
grew out of the observation that these grow roughly like (log X)^rank.
Ranks and conductors are quoted from Cremona's tables, not computed here.
"""
import math
#: Weierstrass coefficients (a1, a2, a3, a4, a6) and ranks from Cremona's tables.
CURVES = {
"11a1": ((0, -1, 1, -10, -20), 0),
"37a1": ((0, 0, 1, -1, 0), 1),
"389a1": ((0, 1, 1, -2, 0), 2),
"5077a1": ((0, 0, 1, -7, 6), 3),
}
def primes_below(n):
"""All primes p < n (sieve of Eratosthenes)."""
sieve = bytearray([1]) * max(n, 2)
sieve[0] = sieve[1] = 0
for i in range(2, int(n ** 0.5) + 1):
if sieve[i]:
sieve[i * i::i] = bytearray(len(range(i * i, n, i)))
return [i for i in range(n) if sieve[i]]
def count_points(coeffs, p):
"""N_p: points of y^2 + a1 xy + a3 y = x^3 + a2 x^2 + a4 x + a6 over F_p."""
a1, a2, a3, a4, a6 = coeffs
if p == 2:
return 1 + sum(1 for x in range(2) for y in range(2)
if (y * y + a1 * x * y + a3 * y
- x ** 3 - a2 * x * x - a4 * x - a6) % 2 == 0)
# Complete the square: (2y + a1 x + a3)^2 = 4(x^3 + a2 x^2 + a4 x + a6)
# + (a1 x + a3)^2, and count square roots of the right-hand side.
roots = [0] * p
for y in range(p):
roots[y * y % p] += 1
total = 1 # the point at infinity
for x in range(p):
rhs = 4 * (x ** 3 + a2 * x * x + a4 * x + a6) + (a1 * x + a3) ** 2
total += roots[rhs % p]
return total
def trace_of_frobenius(coeffs, p):
"""a_p = p + 1 - N_p."""
return p + 1 - count_points(coeffs, p)
def sato_tate_mass(lo, hi):
"""Integral of (2/pi) sin^2(t) dt from lo to hi."""
def F(t):
return (t - math.sin(t) * math.cos(t)) / math.pi
return F(hi) - F(lo)
def euler_products(coeffs, checkpoints, primes):
"""prod_{p <= X} N_p / p at each X in checkpoints (sorted)."""
out, prod, k = [], 1.0, 0
for p in primes:
while k < len(checkpoints) and p > checkpoints[k]:
out.append(prod)
k += 1
prod *= count_points(coeffs, p) / p
while k < len(checkpoints):
out.append(prod)
k += 1
return out
def main():
primes = primes_below(1000)
coeffs37 = CURVES["37a1"][0]
good = [p for p in primes if p != 37]
ratios = [abs(trace_of_frobenius(coeffs37, p)) / (2 * math.sqrt(p))
for p in good]
worst = max(range(len(good)), key=lambda i: ratios[i])
print(f"37a1: y^2 + y = x^3 - x, all {len(good)} good primes p < 1000")
print(f"1. Hasse: max |a_p| / (2 sqrt p) = {ratios[worst]:.4f} "
f"(at p = {good[worst]}); <= 1 every time")
print()
print("2. Sato-Tate angles theta_p, a_p = 2 sqrt(p) cos(theta_p):")
print(" bin (degrees) observed Sato-Tate prediction")
angles = [math.acos(trace_of_frobenius(coeffs37, p) / (2 * math.sqrt(p)))
for p in good]
for k in range(6):
lo, hi = k * math.pi / 6, (k + 1) * math.pi / 6
seen = sum(1 for t in angles if lo <= t < hi or (k == 5 and t == hi))
expected = len(angles) * sato_tate_mass(lo, hi)
print(f" {30 * k:3d}-{30 * k + 30:3d} {seen:8d} {expected:10.1f}")
print()
print("3. Birch-Swinnerton-Dyer products prod_{p <= X} N_p / p:")
checkpoints = [100, 250, 500, 1000]
print(" curve rank" + "".join(f" X = {x:4d}" for x in checkpoints))
for name, (coeffs, rank) in CURVES.items():
values = euler_products(coeffs, checkpoints, primes)
print(f" {name:7s} {rank:3d}" + "".join(f" {v:9.1f}" for v in values))
print()
print("Epistemic status: the point counts are exact and the Hasse check is")
print("exhaustive for these primes, but only Hasse's theorem covers all p.")
print(f"The Sato-Tate table ({len(angles)} angles) and the BSD products are "
"numerical")
print("illustrations: the products grow faster for larger rank, as Birch and")
print("Swinnerton-Dyer saw, but finite data cannot prove or refute the")
print("conjecture; ranks are quoted from Cremona's tables, not computed.")
if __name__ == "__main__":
main()Be precise about what this shows. The counts are exact, and the Hasse check is exhaustive for these primes — but Hasse's theorem is what covers every prime. The Sato–Tate and BSD tables are numerical illustrations of asymptotic statements; the BSD products in particular converge very slowly and fluctuate (the rank- column dips between and ). The ordering by rank is visible, which is what Birch and Swinnerton-Dyer saw; a proof needs other tools entirely.
Seeing the curves
The family . Move and . When the real points form two pieces (an "egg" and an unbounded branch); when it is positive, one piece. At the curve acquires a cusp, and at , a node: these are the singular cubics excluded by .
Elliptic curves y² = x³ + ax + b
Two real components or one? Find the cusp at a = b = 0 and the node at a = −3, b = 2.
- upper half
- lower half
- upper half: y = 1
- lower half: y = −1
Bachet's tangent. The tangent to at has slope . It meets the curve again at , and reflecting gives . Trace along the line to see it touch the curve at and cross it at .
Doubling a point on Bachet's curve
Move the sliders and trace along the curves to read off values.
- y = √(x³ − 2)
- y = −√(x³ − 2)
- tangent at P
- y = √(x³ − 2): y = undefined here
- y = −√(x³ − 2): y = undefined here
- tangent at P: y = −0.4
Sato–Tate in a histogram. These are the values for and the first primes (computed by the second experiment). Sato–Tate predicts the semicircle density on : a hump in the middle, thin tails. With only primes the agreement is rough — evidence, not proof.
Normalised traces a_p / 2√p for the curve 37a1
Show the same data as tallies, pictures, bars or dots, and find the mean, median and mode.
Each bar counts the values from its left edge up to, but not including, its right edge.
Exercises
1. Arithmetic geometry and elliptic curves
Warm-upHumanOn the point has order , and . What is the order of the point ?
2. Arithmetic geometry and elliptic curves
CoreHumanCount the points of over , including the point at infinity. (The non-zero squares mod are .)
3. Arithmetic geometry and elliptic curves
CoreHumanFor over we found , so . Use , where are the roots of , to find .
4. Arithmetic geometry and elliptic curves
CoreHumanLet , so , and . By the Nagell–Lutz theorem, a torsion point has integer coordinates with or . List every integer that is allowed.
5. Arithmetic geometry and elliptic curves
CoreHumanIn the proof of Hasse's theorem we showed for all integers , and concluded . Which justification of the last step is correct?
6. Arithmetic geometry and elliptic curves
StretchHumanLet . For which fields is not finitely generated? (Choose all that apply.)
7. Arithmetic geometry and elliptic curves
CoreFormalThe lesson's Lean theorem chord_third_point has hypotheses h₁ : y₁ ^ 2 = x₁ ^ 3 + a * x₁ + b, h₂ : y₂ ^ 2 = x₂ ^ 3 + a * x₂ + b, hx : x₁ ≠ x₂ and hℓ : y₂ - y₁ = ℓ * (x₂ - x₁). What would go wrong if we deleted hx?
8. Arithmetic geometry and elliptic curves
CoreComputationalWrite count_points(p, a, b) returning for over ( an odd prime), including the point at infinity. Then use it to check the Hasse bound for every curve over , .
9. Arithmetic geometry and elliptic curves
StretchHumanWhich of these statements about elliptic curves over are proved theorems (as of this lesson)? Choose all that apply.
Common misconceptions
Misconception
"Elliptic curves are ellipses." They are not: an ellipse is a conic (genus ), an elliptic curve is a cubic of genus . The name comes from elliptic integrals such as , which arise in computing the arc length of an ellipse; inverting them gives the elliptic functions that parametrise the complex points of .
Misconception
"The Mordell–Weil theorem gives an algorithm for the rank." The proof is ineffective at one point: the weak theorem bounds by the computable -Selmer group, but the gap between them is measured by Ш, which is not known to be finite in general. No algorithm is known that provably computes the rank of every elliptic curve over ; in practice descent plus point search succeeds, and it would always succeed if Ш were finite.
Misconception
"Wiles proved the Taniyama–Shimura conjecture." Wiles (with Taylor–Wiles) proved modularity of semistable curves, which suffices for Fermat. The full modularity theorem was completed in 2001 by Breuil, Conrad, Diamond and Taylor, building on Wiles's methods.
Misconception
"BSD is known in ranks 0 and 1." What is known (Gross–Zagier, Kolyvagin, plus modularity) is that analytic rank or implies algebraic rank equal to it and Ш finite. The exact formula for the leading coefficient is proved only for many individual curves and families, not in general — and nothing comparable is known when the analytic rank is or more.
Misconception
" is small, so determines nothing interesting." The are anything but noise: they determine up to isogeny (Faltings), they are the Fourier coefficients of a modular form (Theorem 8), and their statistics follow Sato–Tate. Hasse's bound says only that the fluctuation is of size at most .
Viewpoints
Geometry— Genus decides
For a smooth projective curve over a number field the genus governs the rational points: genus — none or a 's worth; genus — a finitely generated group (once there is one point); genus — finitely many (Faltings). Geometrically, the group law is the identification , , given by Riemann–Roch, and " iff are collinear" because a line cuts out a divisor linearly equivalent to . For higher genus the analogue of is the Jacobian , an abelian variety of dimension into which embeds — and Faltings's theorem says meets the finitely generated group in only finitely many points. See algebraic geometry.
Topology— Tori, circles and the Lefschetz trace formula
Over , an elliptic curve is a torus: the Weierstrass function for a lattice gives a complex-analytic group isomorphism , (for the equation ). So as a group, and is a closed subgroup of dimension one: one circle when , two circles when — the components you see in the plot. The Weil conjectures are topology in disguise: Grothendieck's -adic cohomology gives the Lefschetz fixed-point formula , and because a torus has two independent loops. See algebraic topology.
Analysis— Elliptic functions and L-functions
Analysis enters twice. First, at the infinite place: is doubly periodic and satisfies , and the periods are the elliptic integrals that gave the subject its name; the real period appears in the BSD formula. Second, globally: converges for by Hasse's bound, and its continuation to — the centre of the critical strip — needs modularity, i.e. it is the Mellin transform of a weight- cusp form. BSD then asks an analyst's question (the order of a zero) about an algebraist's object (a group). See analytic number theory.
Algebra— Galois representations and the Tate module
For a prime , the -torsion over , and the inverse limit carries an action of : a Galois representation , unramified at primes with and . Serre's open image theorem (1972) says the image is open for curves without complex multiplication. Modularity is the statement that is also attached to a modular form, the first non-abelian case of the Langlands correspondence; Wiles proved it by identifying a deformation ring with a Hecke algebra, "". See the Langlands programme.
Computation— Cryptography and algorithms
Over a large prime field, the discrete logarithm problem in — given and , find — has no known subexponential algorithm for well-chosen curves, so Koblitz and Miller (1985) proposed elliptic-curve cryptography, now standard for key exchange and signatures (see cryptography). The security is conditional on the hardness assumption, and Shor's algorithm would break it on a large quantum computer. Schoof's algorithm (1985) counts in time polynomial in by computing for small primes from the action of Frobenius on ; H. W. Lenstra's elliptic curve method (1987) factors integers by working in as if were prime. Cremona's tables and the LMFDB list hundreds of thousands of curves with their ranks, generators and -values.
Logic— Hilbert's tenth problem
Hilbert asked for an algorithm to decide whether a polynomial equation has integer solutions. Matiyasevich (1970), completing work of Davis, Putnam and Robinson, proved that none exists. Over the question is open; Mazur's conjectures on the topology of rational points suggest that is not Diophantine in , which would block the standard approach. Over the ring of integers of a number field, Poonen and Shlapentokh showed that a negative answer would follow from an elliptic curve over whose rank does not grow over . Proofs that such curves exist for every number field, and hence that Hilbert's tenth problem is undecidable over every , were announced in 2024 by Koymans and Pagano and independently by Alpöge, Bhargava, Ho and Shnidman. See computability.
History and global context
- c. 250 CE. Diophantus of Alexandria's Arithmetica finds rational solutions of quadratic and cubic equations by intersecting with well-chosen lines.
- 628 and 1150. Brahmagupta composes solutions of (his bhāvanā), in effect a group law on a conic; Bhāskara II's chakravala method finds the fundamental solution. Genus- curves with a group law were thus studied in India long before elliptic curves.
- 10th century. The congruent number problem appears in Arabic manuscripts; Fibonacci (1225) shows that is congruent.
- 1621–1670. Bachet's edition of Diophantus, with his duplication formula for ; in its margin Fermat writes his "Last Theorem" and later proves the case by infinite descent.
- 18th–19th centuries. Euler treats ; Abel and Jacobi invert elliptic integrals; Weierstrass introduces .
- 1901–1928. Poincaré formulates the group law and asks about the rank; Mordell proves finite generation over (1922); Weil extends it to number fields and abelian varieties (1928).
- 1933–1974. Hasse proves his bound; Weil proves the Riemann hypothesis for curves and states his conjectures (1949); Dwork (1960), Grothendieck's school and Deligne (1974) prove them.
- 1955–1967. Yutaka Taniyama poses problems at the Tokyo–Nikkō symposium suggesting a link between elliptic curves and modular forms; Goro Shimura sharpens it; Weil (1967) makes it precise with the conductor.
- 1960s. Bryan Birch and Peter Swinnerton-Dyer formulate their conjecture from EDSAC computations at Cambridge; Mikio Sato and John Tate independently conjecture the distribution.
- 1977–1989. Mazur classifies torsion over ; Coates–Wiles; Faltings proves Mordell's conjecture (1983); Tunnell's criterion (1983); Frey's curve and Ribet's theorem; Gross–Zagier and Kolyvagin.
- 1994–2001. Andrew Wiles, with Richard Taylor, proves modularity of semistable curves and Fermat's Last Theorem; Breuil, Conrad, Diamond and Taylor complete modularity.
- 2008–present. The Sato–Tate conjecture (Clozel, Harris, Shepherd-Barron, Taylor; Barnet-Lamb, Geraghty, Harris, Taylor); Bhargava and Shankar's average-rank theorems; Yuan, Zhang and Zhang's general Gross–Zagier formula (2013); Tian Ye's work on congruent numbers.
Further reading
- Joseph H. Silverman and John Tate, Rational Points on Elliptic Curves (1992; 2nd ed. 2015) — the gentlest rigorous introduction: group law, Nagell–Lutz, Mordell over , finite fields.
- Joseph H. Silverman, The Arithmetic of Elliptic Curves (1986; 2nd ed. 2009) — the standard graduate text; Chapters III (group law, isogenies), V (finite fields, Hasse), VIII (Mordell–Weil), X (descent and Ш).
- Neal Koblitz, Introduction to Elliptic Curves and Modular Forms (1984; 2nd ed. 1993) — built around the congruent number problem and Tunnell's theorem.
- Fred Diamond and Jerry Shurman, A First Course in Modular Forms (2005) — modular curves, Hecke operators and the statement of modularity.
- Lawrence C. Washington, Elliptic Curves: Number Theory and Cryptography (2nd ed. 2008) — computational and cryptographic aspects, Schoof's algorithm.
- Gary Cornell, Joseph H. Silverman and Glenn Stevens (eds.), Modular Forms and Fermat's Last Theorem (1997) — expository articles on every step of the proof.
- Andrew Wiles, "Modular elliptic curves and Fermat's Last Theorem", Annals of Mathematics 141 (1995).
A reading path: Silverman–Tate Chapters 1–4 → Silverman Chapters III, V, VII, VIII → Diamond–Shurman for modular forms → the Cornell–Silverman–Stevens volume for the proof of Fermat's Last Theorem, or the Clay Institute's problem description of BSD (by Wiles) and the surveys of Bhargava's work for current research.