2. First Reductions Of The Problem
2.1. Goal
The goal of this chapter is to reduce FLT to a deep theorem of Mazur and a deep theorem of Wiles about a Galois representation.
2.2. Overview
The proof of Fermat's Last Theorem is by contradiction. We assume that we have
a counterexample a^n+b^n=c^n, and manipulate it until it satisfies the
axioms of a Frey package, a basic concept which we will explain below. From the
Frey package we build a Frey curve, an elliptic curve defined over \Q. We
then look at a certain representation of a Galois group coming from this
elliptic curve, and finally, using two very deep and independent theorems, one
due to Mazur and the other due to Wiles, we show that this representation is
both reducible and irreducible, the contradiction we seek.
2.3. Reduction To n >= 5 And Prime
-
FermatLastTheorem.of_odd_primes[complete]
If there is a counterexample to Fermat's Last Theorem, then there is a
counterexample a^p+b^p=c^p with p an odd prime.
Lean code for Lemma2.1●1 theorem
Associated Lean declarations
-
FermatLastTheorem.of_odd_primes[complete]
-
FermatLastTheorem.of_odd_primes[complete]
-
theoremdefined in Mathlib/NumberTheory/FLT/Four.leancomplete
theorem FermatLastTheorem.of_odd_primes
FermatLastTheorem.of_odd_primes (hprimes : ∀ (p : ℕ), Nat.Prime p → Odd p → FermatLastTheoremFor p) : FermatLastTheoremTo prove Fermat's Last Theorem, it suffices to prove it for odd prime exponents.(hprimes∀ (p : ℕ), Nat.Prime p → Odd p → FermatLastTheoremFor p: ∀ (pℕ: ℕNat : TypeThe natural numbers, starting at zero. This type is special-cased by both the kernel and the compiler, and overridden with an efficient implementation. Both use a fast arbitrary-precision arithmetic library (usually [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.), Nat.PrimeNat.Prime (p : ℕ) : Prop`Nat.Prime p` means that `p` is a prime number, that is, a natural number at least 2 whose only divisors are `p` and `1`. The theorem `Nat.prime_def` witnesses this description of a prime number.pℕ→ OddOdd.{u_2} {α : Type u_2} [Semiring α] (a : α) : PropAn element `a` of a semiring is odd if there exists `k` such `a = 2*k + 1`.pℕ→ FermatLastTheoremForFermatLastTheoremFor (n : ℕ) : PropStatement of Fermat's Last Theorem over the naturals for a given exponent.pℕ) : FermatLastTheoremFermatLastTheorem : PropStatement of Fermat's Last Theorem: `a ^ n + b ^ n = c ^ n` has no nontrivial natural solution when `n ≥ 3`. This is now a theorem of Wiles and Taylor--Wiles; see https://github.com/ImperialCollegeLondon/FLT for an ongoing Lean formalisation of a proof.theorem FermatLastTheorem.of_odd_primes
FermatLastTheorem.of_odd_primes (hprimes : ∀ (p : ℕ), Nat.Prime p → Odd p → FermatLastTheoremFor p) : FermatLastTheoremTo prove Fermat's Last Theorem, it suffices to prove it for odd prime exponents.(hprimes∀ (p : ℕ), Nat.Prime p → Odd p → FermatLastTheoremFor p: ∀ (pℕ: ℕNat : TypeThe natural numbers, starting at zero. This type is special-cased by both the kernel and the compiler, and overridden with an efficient implementation. Both use a fast arbitrary-precision arithmetic library (usually [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.), Nat.PrimeNat.Prime (p : ℕ) : Prop`Nat.Prime p` means that `p` is a prime number, that is, a natural number at least 2 whose only divisors are `p` and `1`. The theorem `Nat.prime_def` witnesses this description of a prime number.pℕ→ OddOdd.{u_2} {α : Type u_2} [Semiring α] (a : α) : PropAn element `a` of a semiring is odd if there exists `k` such `a = 2*k + 1`.pℕ→ FermatLastTheoremForFermatLastTheoremFor (n : ℕ) : PropStatement of Fermat's Last Theorem over the naturals for a given exponent.pℕ) : FermatLastTheoremFermatLastTheorem : PropStatement of Fermat's Last Theorem: `a ^ n + b ^ n = c ^ n` has no nontrivial natural solution when `n ≥ 3`. This is now a theorem of Wiles and Taylor--Wiles; see https://github.com/ImperialCollegeLondon/FLT for an ongoing Lean formalisation of a proof.To prove Fermat's Last Theorem, it suffices to prove it for odd prime exponents.
This proof is already in mathlib, but the TeX blueprint spells it out for completeness.
Say a^n + b^n = c^n is a counterexample to Fermat's Last Theorem. Every
positive integer is either a power of 2 or has an odd prime factor. If
n = kp has an odd prime factor p, then
(a^k)^p + (b^k)^p = (c^k)^p, which is the counterexample we seek.
It remains to deal with the case where n is a power of 2, so let us assume
this. We have 3 \le n by assumption, so n = 4k is a multiple of 4, and
thus (a^k)^4 + (b^k)^4 = (c^k)^4, giving a counterexample to Fermat's Last
Theorem for n = 4. But Fermat's theorem for exponent 4, already in mathlib,
says that this is impossible.
Euler proved Fermat's Last Theorem for p = 3.
-
fermatLastTheoremThree[complete]
There are no solutions in positive integers to a^3+b^3=c^3.
Lean code for Lemma2.2●1 theorem
Associated Lean declarations
-
fermatLastTheoremThree[complete]
-
fermatLastTheoremThree[complete]
-
theoremdefined in Mathlib/NumberTheory/FLT/Three.leancomplete
theorem fermatLastTheoremThree
fermatLastTheoremThree : FermatLastTheoremFor 3Fermat's Last Theorem for `n = 3`: if `a b c : ℕ` are all non-zero then `a ^ 3 + b ^ 3 ≠ c ^ 3`.: FermatLastTheoremForFermatLastTheoremFor (n : ℕ) : PropStatement of Fermat's Last Theorem over the naturals for a given exponent.3theorem fermatLastTheoremThree
fermatLastTheoremThree : FermatLastTheoremFor 3Fermat's Last Theorem for `n = 3`: if `a b c : ℕ` are all non-zero then `a ^ 3 + b ^ 3 ≠ c ^ 3`.: FermatLastTheoremForFermatLastTheoremFor (n : ℕ) : PropStatement of Fermat's Last Theorem over the naturals for a given exponent.3Fermat's Last Theorem for `n = 3`: if `a b c : ℕ` are all non-zero then `a ^ 3 + b ^ 3 ≠ c ^ 3`.
The proof in mathlib was formalized by a team from the "Lean For the Curious
Mathematician" conference held in Luminy in March 2024 (its dependency graph
can be visualised here).
- Lemma 2.1
- Lemma 2.2
- Definition 2.4
- Lemma 2.5
- Definition 2.6
- Theorem 2.7
- Theorem 2.8
- Corollary 2.9
- Corollary 2.10
-
FermatLastTheorem.of_p_ge_5[complete]
If there is a counterexample to Fermat's Last Theorem, then there is a
counterexample a^p+b^p=c^p with p prime and p \ge 5.
Lean code for Corollary2.3●1 theorem
Associated Lean declarations
-
FermatLastTheorem.of_p_ge_5[complete]
-
FermatLastTheorem.of_p_ge_5[complete]
-
theoremdefined in FLT/Basic/FreyPackage.leancomplete
theorem FermatLastTheorem.of_p_ge_5
FermatLastTheorem.of_p_ge_5 (H : ∀ p ≥ 5, Nat.Prime p → FermatLastTheoremFor p) : FermatLastTheoremIf Fermat's Last Theorem is true for primes `p ≥ 5`, then FLT is true.(H∀ p ≥ 5, Nat.Prime p → FermatLastTheoremFor p: ∀ pℕ≥ 5, Nat.PrimeNat.Prime (p : ℕ) : Prop`Nat.Prime p` means that `p` is a prime number, that is, a natural number at least 2 whose only divisors are `p` and `1`. The theorem `Nat.prime_def` witnesses this description of a prime number.pℕ→ FermatLastTheoremForFermatLastTheoremFor (n : ℕ) : PropStatement of Fermat's Last Theorem over the naturals for a given exponent.pℕ) : FermatLastTheoremFermatLastTheorem : PropStatement of Fermat's Last Theorem: `a ^ n + b ^ n = c ^ n` has no nontrivial natural solution when `n ≥ 3`. This is now a theorem of Wiles and Taylor--Wiles; see https://github.com/ImperialCollegeLondon/FLT for an ongoing Lean formalisation of a proof.theorem FermatLastTheorem.of_p_ge_5
FermatLastTheorem.of_p_ge_5 (H : ∀ p ≥ 5, Nat.Prime p → FermatLastTheoremFor p) : FermatLastTheoremIf Fermat's Last Theorem is true for primes `p ≥ 5`, then FLT is true.(H∀ p ≥ 5, Nat.Prime p → FermatLastTheoremFor p: ∀ pℕ≥ 5, Nat.PrimeNat.Prime (p : ℕ) : Prop`Nat.Prime p` means that `p` is a prime number, that is, a natural number at least 2 whose only divisors are `p` and `1`. The theorem `Nat.prime_def` witnesses this description of a prime number.pℕ→ FermatLastTheoremForFermatLastTheoremFor (n : ℕ) : PropStatement of Fermat's Last Theorem over the naturals for a given exponent.pℕ) : FermatLastTheoremFermatLastTheorem : PropStatement of Fermat's Last Theorem: `a ^ n + b ^ n = c ^ n` has no nontrivial natural solution when `n ≥ 3`. This is now a theorem of Wiles and Taylor--Wiles; see https://github.com/ImperialCollegeLondon/FLT for an ongoing Lean formalisation of a proof.If Fermat's Last Theorem is true for primes `p ≥ 5`, then FLT is true.
2.4. Frey Packages
For convenience we make the following definition.
- Lemma 2.1
- Lemma 2.2
- Corollary 2.3
- Lemma 2.5
- Definition 2.6
- Theorem 2.7
- Theorem 2.8
- Corollary 2.9
- Corollary 2.10
-
FreyPackage[complete]
A Frey package (a,b,c,p) is three nonzero pairwise-coprime integers a,
b, and c, with a \equiv 3 \pmod 4 and b \equiv 0 \pmod 2, together
with a prime p \ge 5, such that a^p+b^p=c^p.
Lean code for Definition2.4●1 definition
Associated Lean declarations
-
FreyPackage[complete]
-
FreyPackage[complete]
-
structuredefined in FLT/Basic/FreyPackage.leancomplete
structure FreyPackage
FreyPackage : TypeA *Frey Package* is a 4-tuple (a,b,c,p) of integers satisfying $a^p+b^p=c^p$ and some other inequalities and congruences. These facts guarantee that all of the all the results in section 4.1 of Serre's paper [serre] apply to the curve $Y^2=X(X-a^p)(X+b^p).$: TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`.structure FreyPackage
FreyPackage : TypeA *Frey Package* is a 4-tuple (a,b,c,p) of integers satisfying $a^p+b^p=c^p$ and some other inequalities and congruences. These facts guarantee that all of the all the results in section 4.1 of Serre's paper [serre] apply to the curve $Y^2=X(X-a^p)(X+b^p).$: TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`.A *Frey Package* is a 4-tuple (a,b,c,p) of integers satisfying $a^p+b^p=c^p$ and some other inequalities and congruences. These facts guarantee that all of the all the results in section 4.1 of Serre's paper [serre] apply to the curve $Y^2=X(X-a^p)(X+b^p).$
Fields
a
ℤThe integer `a` in the Frey package.: ℤInt : TypeThe integers. This type is special-cased by the compiler and overridden with an efficient implementation. The runtime has a special representation for `Int` that stores “small” signed numbers directly, while larger numbers use a fast arbitrary-precision arithmetic library (usually [GMP](https://gmplib.org/)). A “small number” is an integer that can be encoded with one fewer bits than the platform's pointer size (i.e. 63 bits on 64-bit architectures and 31 bits on 32-bit architectures).The integer `a` in the Frey package.
b
ℤThe integer `b` in the Frey package.: ℤInt : TypeThe integers. This type is special-cased by the compiler and overridden with an efficient implementation. The runtime has a special representation for `Int` that stores “small” signed numbers directly, while larger numbers use a fast arbitrary-precision arithmetic library (usually [GMP](https://gmplib.org/)). A “small number” is an integer that can be encoded with one fewer bits than the platform's pointer size (i.e. 63 bits on 64-bit architectures and 31 bits on 32-bit architectures).The integer `b` in the Frey package.
c
ℤThe integer `c` in the Frey package.: ℤInt : TypeThe integers. This type is special-cased by the compiler and overridden with an efficient implementation. The runtime has a special representation for `Int` that stores “small” signed numbers directly, while larger numbers use a fast arbitrary-precision arithmetic library (usually [GMP](https://gmplib.org/)). A “small number” is an integer that can be encoded with one fewer bits than the platform's pointer size (i.e. 63 bits on 64-bit architectures and 31 bits on 32-bit architectures).The integer `c` in the Frey package.
ha0
self.a ≠ 0: selfFreyPackage.aFreyPackage.a (self : FreyPackage) : ℤThe integer `a` in the Frey package.≠Ne.{u} {α : Sort u} (a b : α) : Prop`a ≠ b`, or `Ne a b` is defined as `¬ (a = b)` or `a = b → False`, and asserts that `a` and `b` are not equal. Conventions for notations in identifiers: * The recommended spelling of `≠` in identifiers is `ne`.0hb0
self.b ≠ 0: selfFreyPackage.bFreyPackage.b (self : FreyPackage) : ℤThe integer `b` in the Frey package.≠Ne.{u} {α : Sort u} (a b : α) : Prop`a ≠ b`, or `Ne a b` is defined as `¬ (a = b)` or `a = b → False`, and asserts that `a` and `b` are not equal. Conventions for notations in identifiers: * The recommended spelling of `≠` in identifiers is `ne`.0hc0
self.c ≠ 0: selfFreyPackage.cFreyPackage.c (self : FreyPackage) : ℤThe integer `c` in the Frey package.≠Ne.{u} {α : Sort u} (a b : α) : Prop`a ≠ b`, or `Ne a b` is defined as `¬ (a = b)` or `a = b → False`, and asserts that `a` and `b` are not equal. Conventions for notations in identifiers: * The recommended spelling of `≠` in identifiers is `ne`.0p
ℕThe prime number `p` in the Frey package.: ℕNat : TypeThe natural numbers, starting at zero. This type is special-cased by both the kernel and the compiler, and overridden with an efficient implementation. Both use a fast arbitrary-precision arithmetic library (usually [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.The prime number `p` in the Frey package.
pp
Nat.Prime self.p: Nat.PrimeNat.Prime (p : ℕ) : Prop`Nat.Prime p` means that `p` is a prime number, that is, a natural number at least 2 whose only divisors are `p` and `1`. The theorem `Nat.prime_def` witnesses this description of a prime number.selfFreyPackage.pFreyPackage.p (self : FreyPackage) : ℕThe prime number `p` in the Frey package.hp5
5 ≤ self.p: 5 ≤LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` Conventions for notations in identifiers: * The recommended spelling of `≤` in identifiers is `le`.selfFreyPackage.pFreyPackage.p (self : FreyPackage) : ℕThe prime number `p` in the Frey package.hFLT
self.a ^ self.p + self.b ^ self.p = self.c ^ self.p: selfFreyPackage.aFreyPackage.a (self : FreyPackage) : ℤThe integer `a` in the Frey package.^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`. The meaning of this notation is type-dependent. Conventions for notations in identifiers: * The recommended spelling of `^` in identifiers is `pow`.selfFreyPackage.pFreyPackage.p (self : FreyPackage) : ℕThe prime number `p` in the Frey package.+HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`. The meaning of this notation is type-dependent. Conventions for notations in identifiers: * The recommended spelling of `+` in identifiers is `add`.selfFreyPackage.bFreyPackage.b (self : FreyPackage) : ℤThe integer `b` in the Frey package.^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`. The meaning of this notation is type-dependent. Conventions for notations in identifiers: * The recommended spelling of `^` in identifiers is `pow`.selfFreyPackage.pFreyPackage.p (self : FreyPackage) : ℕThe prime number `p` in the Frey package.=Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`. We use `a = b` as notation for `Eq a b`. A fundamental property of equality is that it is an equivalence relation. ``` variable (α : Type) (a b c d : α) variable (hab : a = b) (hcb : c = b) (hcd : c = d) example : a = d := Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd ``` Equality is much more than an equivalence relation, however. It has the important property that every assertion respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value. That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`. Example: ``` example (α : Type) (a b : α) (p : α → Prop) (h1 : a = b) (h2 : p a) : p b := Eq.subst h1 h2 example (α : Type) (a b : α) (p : α → Prop) (h1 : a = b) (h2 : p a) : p b := h1 ▸ h2 ``` The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`. For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality) Conventions for notations in identifiers: * The recommended spelling of `=` in identifiers is `eq`.selfFreyPackage.cFreyPackage.c (self : FreyPackage) : ℤThe integer `c` in the Frey package.^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`. The meaning of this notation is type-dependent. Conventions for notations in identifiers: * The recommended spelling of `^` in identifiers is `pow`.selfFreyPackage.pFreyPackage.p (self : FreyPackage) : ℕThe prime number `p` in the Frey package.hgcdab
gcd self.a self.b = 1: gcdGCDMonoid.gcd.{u_2} {α : Type u_2} {inst✝ : CommMonoidWithZero α} [self : GCDMonoid α] : α → α → αThe greatest common divisor between two elements.selfFreyPackage.aFreyPackage.a (self : FreyPackage) : ℤThe integer `a` in the Frey package.selfFreyPackage.bFreyPackage.b (self : FreyPackage) : ℤThe integer `b` in the Frey package.=Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`. We use `a = b` as notation for `Eq a b`. A fundamental property of equality is that it is an equivalence relation. ``` variable (α : Type) (a b c d : α) variable (hab : a = b) (hcb : c = b) (hcd : c = d) example : a = d := Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd ``` Equality is much more than an equivalence relation, however. It has the important property that every assertion respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value. That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`. Example: ``` example (α : Type) (a b : α) (p : α → Prop) (h1 : a = b) (h2 : p a) : p b := Eq.subst h1 h2 example (α : Type) (a b : α) (p : α → Prop) (h1 : a = b) (h2 : p a) : p b := h1 ▸ h2 ``` The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`. For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality) Conventions for notations in identifiers: * The recommended spelling of `=` in identifiers is `eq`.1ha4
↑self.a = 3: ↑selfFreyPackage.aFreyPackage.a (self : FreyPackage) : ℤThe integer `a` in the Frey package.=Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`. We use `a = b` as notation for `Eq a b`. A fundamental property of equality is that it is an equivalence relation. ``` variable (α : Type) (a b c d : α) variable (hab : a = b) (hcb : c = b) (hcd : c = d) example : a = d := Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd ``` Equality is much more than an equivalence relation, however. It has the important property that every assertion respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value. That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`. Example: ``` example (α : Type) (a b : α) (p : α → Prop) (h1 : a = b) (h2 : p a) : p b := Eq.subst h1 h2 example (α : Type) (a b : α) (p : α → Prop) (h1 : a = b) (h2 : p a) : p b := h1 ▸ h2 ``` The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`. For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality) Conventions for notations in identifiers: * The recommended spelling of `=` in identifiers is `eq`.3hb2
↑self.b = 0: ↑selfFreyPackage.bFreyPackage.b (self : FreyPackage) : ℤThe integer `b` in the Frey package.=Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`. We use `a = b` as notation for `Eq a b`. A fundamental property of equality is that it is an equivalence relation. ``` variable (α : Type) (a b c d : α) variable (hab : a = b) (hcb : c = b) (hcd : c = d) example : a = d := Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd ``` Equality is much more than an equivalence relation, however. It has the important property that every assertion respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value. That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`. Example: ``` example (α : Type) (a b : α) (p : α → Prop) (h1 : a = b) (h2 : p a) : p b := Eq.subst h1 h2 example (α : Type) (a b : α) (p : α → Prop) (h1 : a = b) (h2 : p a) : p b := h1 ▸ h2 ``` The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`. For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality) Conventions for notations in identifiers: * The recommended spelling of `=` in identifiers is `eq`.0
Our next reduction is as follows.
If Fermat's Last Theorem is false for p prime and p \ge 5, then there
exists a Frey package.
Lean code for Lemma2.5●1 theorem
Associated Lean declarations
-
theoremdefined in FLT/Basic/FreyPackage.leancomplete
theorem FreyPackage.of_not_FermatLastTheorem_p_ge_5
FreyPackage.of_not_FermatLastTheorem_p_ge_5 {a b c : ℤ} (ha : a ≠ 0) (hb : b ≠ 0) (hc : c ≠ 0) {p : ℕ} (pp : Nat.Prime p) (hp5 : 5 ≤ p) (H : a ^ p + b ^ p = c ^ p) : Nonempty FreyPackageGiven a counterexample a^p+b^p=c^p to Fermat's Last Theorem with p>=5, there exists a Frey package.{aℤbℤcℤ: ℤInt : TypeThe integers. This type is special-cased by the compiler and overridden with an efficient implementation. The runtime has a special representation for `Int` that stores “small” signed numbers directly, while larger numbers use a fast arbitrary-precision arithmetic library (usually [GMP](https://gmplib.org/)). A “small number” is an integer that can be encoded with one fewer bits than the platform's pointer size (i.e. 63 bits on 64-bit architectures and 31 bits on 32-bit architectures).} (haa ≠ 0: aℤ≠Ne.{u} {α : Sort u} (a b : α) : Prop`a ≠ b`, or `Ne a b` is defined as `¬ (a = b)` or `a = b → False`, and asserts that `a` and `b` are not equal. Conventions for notations in identifiers: * The recommended spelling of `≠` in identifiers is `ne`.0) (hbb ≠ 0: bℤ≠Ne.{u} {α : Sort u} (a b : α) : Prop`a ≠ b`, or `Ne a b` is defined as `¬ (a = b)` or `a = b → False`, and asserts that `a` and `b` are not equal. Conventions for notations in identifiers: * The recommended spelling of `≠` in identifiers is `ne`.0) (hcc ≠ 0: cℤ≠Ne.{u} {α : Sort u} (a b : α) : Prop`a ≠ b`, or `Ne a b` is defined as `¬ (a = b)` or `a = b → False`, and asserts that `a` and `b` are not equal. Conventions for notations in identifiers: * The recommended spelling of `≠` in identifiers is `ne`.0) {pℕ: ℕNat : TypeThe natural numbers, starting at zero. This type is special-cased by both the kernel and the compiler, and overridden with an efficient implementation. Both use a fast arbitrary-precision arithmetic library (usually [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.} (ppNat.Prime p: Nat.PrimeNat.Prime (p : ℕ) : Prop`Nat.Prime p` means that `p` is a prime number, that is, a natural number at least 2 whose only divisors are `p` and `1`. The theorem `Nat.prime_def` witnesses this description of a prime number.pℕ) (hp55 ≤ p: 5 ≤LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` Conventions for notations in identifiers: * The recommended spelling of `≤` in identifiers is `le`.pℕ) (Ha ^ p + b ^ p = c ^ p: aℤ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`. The meaning of this notation is type-dependent. Conventions for notations in identifiers: * The recommended spelling of `^` in identifiers is `pow`.pℕ+HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`. The meaning of this notation is type-dependent. Conventions for notations in identifiers: * The recommended spelling of `+` in identifiers is `add`.bℤ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`. The meaning of this notation is type-dependent. Conventions for notations in identifiers: * The recommended spelling of `^` in identifiers is `pow`.pℕ=Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`. We use `a = b` as notation for `Eq a b`. A fundamental property of equality is that it is an equivalence relation. ``` variable (α : Type) (a b c d : α) variable (hab : a = b) (hcb : c = b) (hcd : c = d) example : a = d := Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd ``` Equality is much more than an equivalence relation, however. It has the important property that every assertion respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value. That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`. Example: ``` example (α : Type) (a b : α) (p : α → Prop) (h1 : a = b) (h2 : p a) : p b := Eq.subst h1 h2 example (α : Type) (a b : α) (p : α → Prop) (h1 : a = b) (h2 : p a) : p b := h1 ▸ h2 ``` The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`. For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality) Conventions for notations in identifiers: * The recommended spelling of `=` in identifiers is `eq`.cℤ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`. The meaning of this notation is type-dependent. Conventions for notations in identifiers: * The recommended spelling of `^` in identifiers is `pow`.pℕ) : NonemptyNonempty.{u} (α : Sort u) : Prop`Nonempty α` is a typeclass that says that `α` is not an empty type, that is, there exists an element in the type. It differs from `Inhabited α` in that `Nonempty α` is a `Prop`, which means that it does not actually carry an element of `α`, only a proof that *there exists* such an element. Given `Nonempty α`, you can construct an element of `α` *nonconstructively* using `Classical.choice`.FreyPackageFreyPackage : TypeA *Frey Package* is a 4-tuple (a,b,c,p) of integers satisfying $a^p+b^p=c^p$ and some other inequalities and congruences. These facts guarantee that all of the all the results in section 4.1 of Serre's paper [serre] apply to the curve $Y^2=X(X-a^p)(X+b^p).$theorem FreyPackage.of_not_FermatLastTheorem_p_ge_5
FreyPackage.of_not_FermatLastTheorem_p_ge_5 {a b c : ℤ} (ha : a ≠ 0) (hb : b ≠ 0) (hc : c ≠ 0) {p : ℕ} (pp : Nat.Prime p) (hp5 : 5 ≤ p) (H : a ^ p + b ^ p = c ^ p) : Nonempty FreyPackageGiven a counterexample a^p+b^p=c^p to Fermat's Last Theorem with p>=5, there exists a Frey package.{aℤbℤcℤ: ℤInt : TypeThe integers. This type is special-cased by the compiler and overridden with an efficient implementation. The runtime has a special representation for `Int` that stores “small” signed numbers directly, while larger numbers use a fast arbitrary-precision arithmetic library (usually [GMP](https://gmplib.org/)). A “small number” is an integer that can be encoded with one fewer bits than the platform's pointer size (i.e. 63 bits on 64-bit architectures and 31 bits on 32-bit architectures).} (haa ≠ 0: aℤ≠Ne.{u} {α : Sort u} (a b : α) : Prop`a ≠ b`, or `Ne a b` is defined as `¬ (a = b)` or `a = b → False`, and asserts that `a` and `b` are not equal. Conventions for notations in identifiers: * The recommended spelling of `≠` in identifiers is `ne`.0) (hbb ≠ 0: bℤ≠Ne.{u} {α : Sort u} (a b : α) : Prop`a ≠ b`, or `Ne a b` is defined as `¬ (a = b)` or `a = b → False`, and asserts that `a` and `b` are not equal. Conventions for notations in identifiers: * The recommended spelling of `≠` in identifiers is `ne`.0) (hcc ≠ 0: cℤ≠Ne.{u} {α : Sort u} (a b : α) : Prop`a ≠ b`, or `Ne a b` is defined as `¬ (a = b)` or `a = b → False`, and asserts that `a` and `b` are not equal. Conventions for notations in identifiers: * The recommended spelling of `≠` in identifiers is `ne`.0) {pℕ: ℕNat : TypeThe natural numbers, starting at zero. This type is special-cased by both the kernel and the compiler, and overridden with an efficient implementation. Both use a fast arbitrary-precision arithmetic library (usually [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.} (ppNat.Prime p: Nat.PrimeNat.Prime (p : ℕ) : Prop`Nat.Prime p` means that `p` is a prime number, that is, a natural number at least 2 whose only divisors are `p` and `1`. The theorem `Nat.prime_def` witnesses this description of a prime number.pℕ) (hp55 ≤ p: 5 ≤LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` Conventions for notations in identifiers: * The recommended spelling of `≤` in identifiers is `le`.pℕ) (Ha ^ p + b ^ p = c ^ p: aℤ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`. The meaning of this notation is type-dependent. Conventions for notations in identifiers: * The recommended spelling of `^` in identifiers is `pow`.pℕ+HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`. The meaning of this notation is type-dependent. Conventions for notations in identifiers: * The recommended spelling of `+` in identifiers is `add`.bℤ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`. The meaning of this notation is type-dependent. Conventions for notations in identifiers: * The recommended spelling of `^` in identifiers is `pow`.pℕ=Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`. We use `a = b` as notation for `Eq a b`. A fundamental property of equality is that it is an equivalence relation. ``` variable (α : Type) (a b c d : α) variable (hab : a = b) (hcb : c = b) (hcd : c = d) example : a = d := Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd ``` Equality is much more than an equivalence relation, however. It has the important property that every assertion respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value. That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`. Example: ``` example (α : Type) (a b : α) (p : α → Prop) (h1 : a = b) (h2 : p a) : p b := Eq.subst h1 h2 example (α : Type) (a b : α) (p : α → Prop) (h1 : a = b) (h2 : p a) : p b := h1 ▸ h2 ``` The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`. For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality) Conventions for notations in identifiers: * The recommended spelling of `=` in identifiers is `eq`.cℤ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`. The meaning of this notation is type-dependent. Conventions for notations in identifiers: * The recommended spelling of `^` in identifiers is `pow`.pℕ) : NonemptyNonempty.{u} (α : Sort u) : Prop`Nonempty α` is a typeclass that says that `α` is not an empty type, that is, there exists an element in the type. It differs from `Inhabited α` in that `Nonempty α` is a `Prop`, which means that it does not actually carry an element of `α`, only a proof that *there exists* such an element. Given `Nonempty α`, you can construct an element of `α` *nonconstructively* using `Classical.choice`.FreyPackageFreyPackage : TypeA *Frey Package* is a 4-tuple (a,b,c,p) of integers satisfying $a^p+b^p=c^p$ and some other inequalities and congruences. These facts guarantee that all of the all the results in section 4.1 of Serre's paper [serre] apply to the curve $Y^2=X(X-a^p)(X+b^p).$Given a counterexample a^p+b^p=c^p to Fermat's Last Theorem with p>=5, there exists a Frey package.
Uses Definition 2.4.
Suppose we have a counterexample a^p+b^p=c^p for the given p; we now build
a Frey package from this data.
If the greatest common divisor of a,b,c is d, then a^p+b^p=c^p implies
(a/d)^p+(b/d)^p=(c/d)^p. Dividing through, we can thus assume that no prime
divides all of a,b,c. Under this assumption we must have that a,b,c are
pairwise coprime, as if some prime divides two of the integers a,b,c then by
a^p+b^p=c^p and unique factorization it must divide all three of them. In
particular we may assume that not all of a,b,c are even, and now reducing
modulo 2 shows that precisely one of them must be even.
Next we show that we can find a counterexample with b even. If a is the
even one, then we can just switch a and b. If c is the even one, then we
can replace c by -b and b by -c, using that p is odd.
The last thing to ensure is that a is 3 mod 4. Because b is even, we
know that a is odd, so it is either 1 or 3 mod 4. If a is 3 mod 4
then we are home; if however a is 1 mod 4, we replace a,b,c by their
negatives, and this is the Frey package we seek.
2.5. Galois Representations And Elliptic Curves
To continue, we need some of the theory of elliptic curves over \Q. So let
f(X) denote any monic cubic polynomial with rational coefficients and whose
three complex roots are distinct, and let us consider the equation
E : Y^2 = f(X), which defines a curve in the (X,Y)-plane. This curve, or
strictly speaking its projectivization, is a so-called elliptic curve over
\Q.
If E : Y^2 = f(X) is an elliptic curve over \Q, and if K is any
characteristic zero field, and hence a \Q-algebra, then we write E(K) for
the set of solutions to y^2=f(x) with x,y \in K, together with an
additional "point at infinity" corresponding morally to x=y=\infty. It is an
extraordinary fact, and not at all obvious, that E(K) naturally has the
structure of an additive abelian group, with the point at infinity being the
zero element, the identity. Fortunately this fact is already in mathlib. This
additive group structure has the property that three distinct points P, Q,
R in K^2 which are in E(K) will sum to zero if and only if they are
collinear.
The group structure behaves well under change of field: if E is an elliptic
curve over \Q and if K\to L is a homomorphism of characteristic zero
fields, then the induced map E(K)\to E(L) is a group homomorphism. Thus if
f:K\to L is an isomorphism of characteristic zero fields, the induced map
E(K)\to E(L) is an isomorphism of groups, with the inverse isomorphism being
the map E(L)\to E(K) induced by f^{-1}. This construction thus gives us an
action of the multiplicative group \Aut(K) of automorphisms of the field K
on the additive abelian group E(K), and hence also on the n-torsion of this
group for any positive integer n. In particular, if \Qbar denotes an
algebraic closure of the rationals, for example the algebraic numbers in
\bbC, and if \GQ denotes the group of field isomorphisms
\Qbar\to\Qbar, then for any elliptic curve E over \Q we have an action
of \GQ on the additive abelian group E(\Qbar), and hence on its
n-torsion subgroup E(\Qbar)[n].
If furthermore n = p is prime, then E(\Qbar)[p] is naturally a vector space
over \Z/p\Z, and therefore it inherits the structure of a mod p
representation of \GQ. This is the mod p Galois representation attached to
the elliptic curve E, and it is well-known to be 2-dimensional. We call it
\rho_{E,p}.
In the next section we apply this theory to the elliptic curve coming from a counterexample to Fermat's Last Theorem.
2.6. The Frey Curve
Recall that a Frey package (a,b,c,p) is a prime p \ge 5 and nonzero
pairwise-coprime integers a, b, and c satisfying a^p+b^p=c^p and the
congruences a \equiv 3 \pmod 4 and b \equiv 0 \pmod 2. We have shown
above that if Fermat's Last Theorem is false, then a Frey package exists.
- Lemma 2.1
- Lemma 2.2
- Corollary 2.3
- Definition 2.4
- Lemma 2.5
- Theorem 2.7
- Theorem 2.8
- Corollary 2.9
- Corollary 2.10
-
FreyPackage.freyCurve[complete]
Uses Definition 2.4.
Given a Frey package (a,b,c,p), the corresponding Frey curve is the elliptic
curve over \Q (considered by Frey and, before him, Hellegouarch) defined by the equation
Y^2 = X(X-a^p)(X+b^p).
Lean code for Definition2.6●1 definition
Associated Lean declarations
-
FreyPackage.freyCurve[complete]
-
FreyPackage.freyCurve[complete]
-
defdefined in FLT/Basic/FreyPackage.leancomplete
def FreyPackage.freyCurve
FreyPackage.freyCurve (P : FreyPackage) : WeierstrassCurve ℚThe elliptic curve over `ℚ` associated to a Frey package. The conditions imposed upon a Frey package guarantee that the running hypotheses in Section 4.1 of [Serre] all hold. We put the curve into the form where the equation is semistable at 2, rather than the usual `Y^2=X(X-a^p)(X+b^p)` form. The change of variables is `X=4x` and `Y=8y+4x`, and then divide through by 64.(PFreyPackage: FreyPackageFreyPackage : TypeA *Frey Package* is a 4-tuple (a,b,c,p) of integers satisfying $a^p+b^p=c^p$ and some other inequalities and congruences. These facts guarantee that all of the all the results in section 4.1 of Serre's paper [serre] apply to the curve $Y^2=X(X-a^p)(X+b^p).$) : WeierstrassCurveWeierstrassCurve.{u} (R : Type u) : Type uA Weierstrass curve `Y² + a₁XY + a₃Y = X³ + a₂X² + a₄X + a₆` with parameters `aᵢ`.ℚRat : TypeRational numbers, implemented as a pair of integers `num / den` such that the denominator is positive and the numerator and denominator are coprime.def FreyPackage.freyCurve
FreyPackage.freyCurve (P : FreyPackage) : WeierstrassCurve ℚThe elliptic curve over `ℚ` associated to a Frey package. The conditions imposed upon a Frey package guarantee that the running hypotheses in Section 4.1 of [Serre] all hold. We put the curve into the form where the equation is semistable at 2, rather than the usual `Y^2=X(X-a^p)(X+b^p)` form. The change of variables is `X=4x` and `Y=8y+4x`, and then divide through by 64.(PFreyPackage: FreyPackageFreyPackage : TypeA *Frey Package* is a 4-tuple (a,b,c,p) of integers satisfying $a^p+b^p=c^p$ and some other inequalities and congruences. These facts guarantee that all of the all the results in section 4.1 of Serre's paper [serre] apply to the curve $Y^2=X(X-a^p)(X+b^p).$) : WeierstrassCurveWeierstrassCurve.{u} (R : Type u) : Type uA Weierstrass curve `Y² + a₁XY + a₃Y = X³ + a₂X² + a₄X + a₆` with parameters `aᵢ`.ℚRat : TypeRational numbers, implemented as a pair of integers `num / den` such that the denominator is positive and the numerator and denominator are coprime.The elliptic curve over `ℚ` associated to a Frey package. The conditions imposed upon a Frey package guarantee that the running hypotheses in Section 4.1 of [Serre] all hold. We put the curve into the form where the equation is semistable at 2, rather than the usual `Y^2=X(X-a^p)(X+b^p)` form. The change of variables is `X=4x` and `Y=8y+4x`, and then divide through by 64.
Note that the roots of the cubic X(X-a^p)(X+b^p) are distinct because a,
b, and c are nonzero and a^p+b^p=c^p.
Given a Frey package (a,b,c,p) with corresponding Frey curve E, the mod
p Galois representation \rho_{E,p} attached to this package is the
2-dimensional representation of \GQ on E(\Qbar)[p] described above.
Frey's observation is that this representation has some very surprising
properties. We will make this remark more explicit in the next chapter. Here we
shall show how these properties can be used to finish the job.
2.7. Reduction To Two Big Theorems
Recall that a representation of a group G on a vector space W is said to be
irreducible if there are precisely two G-stable subspaces of W, namely 0
and W. The representation is said to be reducible otherwise.
Now say (a,b,c,p) is a Frey package. Consider the mod p representation of
\GQ coming from the p-torsion in the Frey curve
Y^2=X(x-a^p)(X+b^p) associated to the package. Let's call this representation
\rho, and we say that \rho is the mod p representation associated to the
Frey package (a,b,c,p). Is \rho irreducible or not?
-
Mazur_Frey[sorry in proof]
Uses Definition 2.6.
If \rho is the mod p Galois representation associated to a Frey package
(a,b,c,p) then \rho is irreducible.
Lean code for Theorem2.7●1 theorem, incomplete
Associated Lean declarations
-
Mazur_Frey[sorry in proof]
-
Mazur_Frey[sorry in proof]
-
theoremdefined in FLT/Basic/Reductions.leancontains sorry
theorem Mazur_Frey
Mazur_Frey (P : FreyPackage) : (P.freyCurve.galoisRep P.p ⋯).IsIrreducible(PFreyPackage: FreyPackageFreyPackage : TypeA *Frey Package* is a 4-tuple (a,b,c,p) of integers satisfying $a^p+b^p=c^p$ and some other inequalities and congruences. These facts guarantee that all of the all the results in section 4.1 of Serre's paper [serre] apply to the curve $Y^2=X(X-a^p)(X+b^p).$) : (PFreyPackage.freyCurveFreyPackage.freyCurve (P : FreyPackage) : WeierstrassCurve ℚThe elliptic curve over `ℚ` associated to a Frey package. The conditions imposed upon a Frey package guarantee that the running hypotheses in Section 4.1 of [Serre] all hold. We put the curve into the form where the equation is semistable at 2, rather than the usual `Y^2=X(X-a^p)(X+b^p)` form. The change of variables is `X=4x` and `Y=8y+4x`, and then divide through by 64..galoisRepWeierstrassCurve.galoisRep.{u} {K : Type u} [Field K] (E : WeierstrassCurve K) [E.IsElliptic] [DecidableEq K] [DecidableEq (AlgebraicClosure K)] (n : ℕ) (hn : 0 < n) : GaloisRep K (ZMod n) ((E.map (algebraMap K (AlgebraicClosure K))).n_torsion n)The continuous Galois representation associated to an elliptic curve over a field.PFreyPackage.pFreyPackage.p (self : FreyPackage) : ℕThe prime number `p` in the Frey package.⋯).IsIrreducibleGaloisRep.IsIrreducible.{uK, u_4, u_7} {K : Type uK} [Field K] {M : Type u_4} [AddCommGroup M] {k : Type u_7} [Field k] [TopologicalSpace k] [Module k M] (ρ : GaloisRep K k M) : PropIrreducibility of a Galois representation over a field.theorem Mazur_Frey
Mazur_Frey (P : FreyPackage) : (P.freyCurve.galoisRep P.p ⋯).IsIrreducible(PFreyPackage: FreyPackageFreyPackage : TypeA *Frey Package* is a 4-tuple (a,b,c,p) of integers satisfying $a^p+b^p=c^p$ and some other inequalities and congruences. These facts guarantee that all of the all the results in section 4.1 of Serre's paper [serre] apply to the curve $Y^2=X(X-a^p)(X+b^p).$) : (PFreyPackage.freyCurveFreyPackage.freyCurve (P : FreyPackage) : WeierstrassCurve ℚThe elliptic curve over `ℚ` associated to a Frey package. The conditions imposed upon a Frey package guarantee that the running hypotheses in Section 4.1 of [Serre] all hold. We put the curve into the form where the equation is semistable at 2, rather than the usual `Y^2=X(X-a^p)(X+b^p)` form. The change of variables is `X=4x` and `Y=8y+4x`, and then divide through by 64..galoisRepWeierstrassCurve.galoisRep.{u} {K : Type u} [Field K] (E : WeierstrassCurve K) [E.IsElliptic] [DecidableEq K] [DecidableEq (AlgebraicClosure K)] (n : ℕ) (hn : 0 < n) : GaloisRep K (ZMod n) ((E.map (algebraMap K (AlgebraicClosure K))).n_torsion n)The continuous Galois representation associated to an elliptic curve over a field.PFreyPackage.pFreyPackage.p (self : FreyPackage) : ℕThe prime number `p` in the Frey package.⋯).IsIrreducibleGaloisRep.IsIrreducible.{uK, u_4, u_7} {K : Type uK} [Field K] {M : Type u_4} [AddCommGroup M] {k : Type u_7} [Field k] [TopologicalSpace k] [Module k M] (ρ : GaloisRep K k M) : PropIrreducibility of a Galois representation over a field.
Uses [??].
This follows from a profound and long result of Mazur
(Mazur, 1977) from 1977, namely the fact that the torsion
subgroup of an elliptic curve over \Q can have size at most 16. In fact
there is still a little more work which needs to be done to deduce the theorem
from Mazur's result. A pre-1990 reference for the full proof of this claim is
Proposition 6 in Section 4.1 of
(Serre, 1987).
Note that in the first (pre-2029) phase of the FLT project, we will not be
working on a formalization of this result, as it was known in the 1980s. We
will however be thinking a lot about the next result, which says the exact
opposite.
-
Wiles_Frey[complete]
Uses Definition 2.6.
If \rho is the mod p Galois representation associated to a Frey package
(a,b,c,p) then \rho is reducible.
Lean code for Theorem2.8●1 theorem
Associated Lean declarations
-
Wiles_Frey[complete]
-
Wiles_Frey[complete]
-
theoremdefined in FLT/Basic/Reductions.leancomplete
theorem Wiles_Frey
Wiles_Frey (P : FreyPackage) : ¬(P.freyCurve.galoisRep P.p ⋯).IsIrreducible(PFreyPackage: FreyPackageFreyPackage : TypeA *Frey Package* is a 4-tuple (a,b,c,p) of integers satisfying $a^p+b^p=c^p$ and some other inequalities and congruences. These facts guarantee that all of the all the results in section 4.1 of Serre's paper [serre] apply to the curve $Y^2=X(X-a^p)(X+b^p).$) : ¬Not (a : Prop) : Prop`Not p`, or `¬p`, is the negation of `p`. It is defined to be `p → False`, so if your goal is `¬p` you can use `intro h` to turn the goal into `h : p ⊢ False`, and if you have `hn : ¬p` and `h : p` then `hn h : False` and `(hn h).elim` will prove anything. For more information: [Propositional Logic](https://lean-lang.org/theorem_proving_in_lean4/propositions_and_proofs.html#propositional-logic) Conventions for notations in identifiers: * The recommended spelling of `¬` in identifiers is `not`.(PFreyPackage.freyCurveFreyPackage.freyCurve (P : FreyPackage) : WeierstrassCurve ℚThe elliptic curve over `ℚ` associated to a Frey package. The conditions imposed upon a Frey package guarantee that the running hypotheses in Section 4.1 of [Serre] all hold. We put the curve into the form where the equation is semistable at 2, rather than the usual `Y^2=X(X-a^p)(X+b^p)` form. The change of variables is `X=4x` and `Y=8y+4x`, and then divide through by 64..galoisRepWeierstrassCurve.galoisRep.{u} {K : Type u} [Field K] (E : WeierstrassCurve K) [E.IsElliptic] [DecidableEq K] [DecidableEq (AlgebraicClosure K)] (n : ℕ) (hn : 0 < n) : GaloisRep K (ZMod n) ((E.map (algebraMap K (AlgebraicClosure K))).n_torsion n)The continuous Galois representation associated to an elliptic curve over a field.PFreyPackage.pFreyPackage.p (self : FreyPackage) : ℕThe prime number `p` in the Frey package.⋯).IsIrreducibleGaloisRep.IsIrreducible.{uK, u_4, u_7} {K : Type uK} [Field K] {M : Type u_4} [AddCommGroup M] {k : Type u_7} [Field k] [TopologicalSpace k] [Module k M] (ρ : GaloisRep K k M) : PropIrreducibility of a Galois representation over a field.theorem Wiles_Frey
Wiles_Frey (P : FreyPackage) : ¬(P.freyCurve.galoisRep P.p ⋯).IsIrreducible(PFreyPackage: FreyPackageFreyPackage : TypeA *Frey Package* is a 4-tuple (a,b,c,p) of integers satisfying $a^p+b^p=c^p$ and some other inequalities and congruences. These facts guarantee that all of the all the results in section 4.1 of Serre's paper [serre] apply to the curve $Y^2=X(X-a^p)(X+b^p).$) : ¬Not (a : Prop) : Prop`Not p`, or `¬p`, is the negation of `p`. It is defined to be `p → False`, so if your goal is `¬p` you can use `intro h` to turn the goal into `h : p ⊢ False`, and if you have `hn : ¬p` and `h : p` then `hn h : False` and `(hn h).elim` will prove anything. For more information: [Propositional Logic](https://lean-lang.org/theorem_proving_in_lean4/propositions_and_proofs.html#propositional-logic) Conventions for notations in identifiers: * The recommended spelling of `¬` in identifiers is `not`.(PFreyPackage.freyCurveFreyPackage.freyCurve (P : FreyPackage) : WeierstrassCurve ℚThe elliptic curve over `ℚ` associated to a Frey package. The conditions imposed upon a Frey package guarantee that the running hypotheses in Section 4.1 of [Serre] all hold. We put the curve into the form where the equation is semistable at 2, rather than the usual `Y^2=X(X-a^p)(X+b^p)` form. The change of variables is `X=4x` and `Y=8y+4x`, and then divide through by 64..galoisRepWeierstrassCurve.galoisRep.{u} {K : Type u} [Field K] (E : WeierstrassCurve K) [E.IsElliptic] [DecidableEq K] [DecidableEq (AlgebraicClosure K)] (n : ℕ) (hn : 0 < n) : GaloisRep K (ZMod n) ((E.map (algebraMap K (AlgebraicClosure K))).n_torsion n)The continuous Galois representation associated to an elliptic curve over a field.PFreyPackage.pFreyPackage.p (self : FreyPackage) : ℕThe prime number `p` in the Frey package.⋯).IsIrreducibleGaloisRep.IsIrreducible.{uK, u_4, u_7} {K : Type uK} [Field K] {M : Type u_4} [AddCommGroup M] {k : Type u_7} [Field k] [TopologicalSpace k] [Module k M] (ρ : GaloisRep K k M) : PropIrreducibility of a Galois representation over a field.
Uses Theorem 3.2 and Theorem 3.3.
This follows from theorem Frey_curve_hardly_ramified, which shows that the
Frey representation is hardly ramified, together with theorem
hardly_ramified_reducible, which shows that any hardly ramified mod p
representation is reducible.
- Lemma 2.1
- Lemma 2.2
- Corollary 2.3
- Definition 2.4
- Lemma 2.5
- Definition 2.6
- Theorem 2.7
- Theorem 2.8
- Corollary 2.10
-
FreyPackage.false[complete]
Uses Theorem 2.7 and Theorem 2.8. There is no Frey package.
Lean code for Corollary2.9●1 theorem
Associated Lean declarations
-
FreyPackage.false[complete]
-
FreyPackage.false[complete]
-
theoremdefined in FLT/Basic/Reductions.leancomplete
theorem FreyPackage.false
FreyPackage.false (P : FreyPackage) : FalseThere is no Frey package. This profound result is proved using work of Mazur and Wiles/Ribet to rule out all possibilities for the $p$-torsion in the corresponding Frey curve.(PFreyPackage: FreyPackageFreyPackage : TypeA *Frey Package* is a 4-tuple (a,b,c,p) of integers satisfying $a^p+b^p=c^p$ and some other inequalities and congruences. These facts guarantee that all of the all the results in section 4.1 of Serre's paper [serre] apply to the curve $Y^2=X(X-a^p)(X+b^p).$) : FalseFalse : Prop`False` is the empty proposition. Thus, it has no introduction rules. It represents a contradiction. `False` elimination rule, `False.rec`, expresses the fact that anything follows from a contradiction. This rule is sometimes called ex falso (short for ex falso sequitur quodlibet), or the principle of explosion. For more information: [Propositional Logic](https://lean-lang.org/theorem_proving_in_lean4/propositions_and_proofs.html#propositional-logic)theorem FreyPackage.false
FreyPackage.false (P : FreyPackage) : FalseThere is no Frey package. This profound result is proved using work of Mazur and Wiles/Ribet to rule out all possibilities for the $p$-torsion in the corresponding Frey curve.(PFreyPackage: FreyPackageFreyPackage : TypeA *Frey Package* is a 4-tuple (a,b,c,p) of integers satisfying $a^p+b^p=c^p$ and some other inequalities and congruences. These facts guarantee that all of the all the results in section 4.1 of Serre's paper [serre] apply to the curve $Y^2=X(X-a^p)(X+b^p).$) : FalseFalse : Prop`False` is the empty proposition. Thus, it has no introduction rules. It represents a contradiction. `False` elimination rule, `False.rec`, expresses the fact that anything follows from a contradiction. This rule is sometimes called ex falso (short for ex falso sequitur quodlibet), or the principle of explosion. For more information: [Propositional Logic](https://lean-lang.org/theorem_proving_in_lean4/propositions_and_proofs.html#propositional-logic)There is no Frey package. This profound result is proved using work of Mazur and Wiles/Ribet to rule out all possibilities for the $p$-torsion in the corresponding Frey curve.
Follows immediately from the previous two theorems Theorem 2.7 and Theorem 2.8.
We deduce.
- Lemma 2.1
- Lemma 2.2
- Corollary 2.3
- Definition 2.4
- Lemma 2.5
- Definition 2.6
- Theorem 2.7
- Theorem 2.8
- Corollary 2.9
-
Wiles_Taylor_Wiles[complete]
Fermat's Last Theorem is true. In other words, there are no positive integers
a, b, and c and natural numbers n >= 3 such that a^n+b^n=c^n.
Lean code for Corollary2.10●1 theorem
Associated Lean declarations
-
Wiles_Taylor_Wiles[complete]
-
Wiles_Taylor_Wiles[complete]
-
theoremdefined in FLT/Basic/Reductions.leancomplete
theorem Wiles_Taylor_Wiles
Wiles_Taylor_Wiles : FermatLastTheoremFermat's Last Theorem is true: FermatLastTheoremFermatLastTheorem : PropStatement of Fermat's Last Theorem: `a ^ n + b ^ n = c ^ n` has no nontrivial natural solution when `n ≥ 3`. This is now a theorem of Wiles and Taylor--Wiles; see https://github.com/ImperialCollegeLondon/FLT for an ongoing Lean formalisation of a proof.theorem Wiles_Taylor_Wiles
Wiles_Taylor_Wiles : FermatLastTheoremFermat's Last Theorem is true: FermatLastTheoremFermatLastTheorem : PropStatement of Fermat's Last Theorem: `a ^ n + b ^ n = c ^ n` has no nontrivial natural solution when `n ≥ 3`. This is now a theorem of Wiles and Taylor--Wiles; see https://github.com/ImperialCollegeLondon/FLT for an ongoing Lean formalisation of a proof.Fermat's Last Theorem is true
Assume there is a there is a counterexample a^n+b^n=c^n. By Corollary
Corollary 2.3, we may assume that there is also a
counterexample a^p+b^p=c^p with p\geq 5 and prime. Then
Lemma 2.5 produces a Frey package,
contradicting Corollary 2.9.
Because we are, for now at least, assuming Mazur's theorem, we now turn our attention to a proof of theorem Theorem 2.8. We start on this proof in [??].