Fermat's Last Theorem Blueprint

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🔗

Lemma2.1
Group: Initial reductions of Fermat's Last Theorem. (9)
Hover another entry in this group to preview it.
L∃∀Nused by 1

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.11 theorem
  • theoremdefined in Mathlib/NumberTheory/FLT/Four.lean
    complete
    theorem FermatLastTheorem.of_odd_primesFermatLastTheorem.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_primesFermatLastTheorem.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.
    
Proof

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.

Lemma2.2
L∃∀Nused by 1

There are no solutions in positive integers to a^3+b^3=c^3.

Lean code for Lemma2.21 theorem
  • theoremdefined in Mathlib/NumberTheory/FLT/Three.lean
    complete
    theorem fermatLastTheoremThreefermatLastTheoremThree : 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.  3
    theorem fermatLastTheoremThreefermatLastTheoremThree : 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.  3
    Fermat's Last Theorem for `n = 3`: if `a b c : ℕ` are all non-zero then
    `a ^ 3 + b ^ 3 ≠ c ^ 3`. 
Proof

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).

Corollary2.3
Group: Initial reductions of Fermat's Last Theorem. (9)
Hover another entry in this group to preview it.
L∃∀Nused by 1

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.31 theorem
  • theoremdefined in FLT/Basic/FreyPackage.lean
    complete
    theorem FermatLastTheorem.of_p_ge_5FermatLastTheorem.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_5FermatLastTheorem.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. 
Proof

Uses Lemma 2.2 and Lemma 2.1. Follows from the previous two lemmas.

2.4. Frey Packages🔗

For convenience we make the following definition.

Definition2.4
L∃∀N
Used by 2
Hover a use site to preview it.
Preview
Lemma 2.5
Loading preview
Hover a use site to preview it.

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.41 definition
  • structure(13 fields)defined in FLT/Basic/FreyPackage.lean
    complete
    structure 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).$
     : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. 
    structure 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).$
     : 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

    aThe 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. 
    bThe 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. 
    cThe 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. 
    ha0self.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`. 0
    hb0self.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`. 0
    hc0self.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`. 0
    pThe 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. 
    ppNat.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. 
    hp55 ≤ 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. 
    hFLTself.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. 
    hgcdabgcd 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`. 1
    ha4↑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`. 3
    hb2↑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.

Lemma2.5
Group: Initial reductions of Fermat's Last Theorem. (9)
Hover another entry in this group to preview it.
L∃∀Nused by 1

If Fermat's Last Theorem is false for p prime and p \ge 5, then there exists a Frey package.

Lean code for Lemma2.51 theorem
  • theoremdefined in FLT/Basic/FreyPackage.lean
    complete
    theorem FreyPackage.of_not_FermatLastTheorem_p_ge_5FreyPackage.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_5FreyPackage.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. 
Proof

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.

Definition2.6
L∃∀N
Used by 2
Hover a use site to preview it.
Preview
Theorem 2.7
Loading preview
Hover a use site to preview it.

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.61 definition
  • complete
    def FreyPackage.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.  (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.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.  (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?

Theorem2.7
L∃∀Nused by 1

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.71 theorem, incomplete
  • theoremdefined in FLT/Basic/Reductions.lean
    contains sorry
    theorem Mazur_FreyMazur_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_FreyMazur_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. 
Proof

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.

Theorem2.8
L∃∀Nused by 1

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.81 theorem
  • theoremdefined in FLT/Basic/Reductions.lean
    complete
    theorem Wiles_FreyWiles_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_FreyWiles_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. 
Proof

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.

Corollary2.9
L∃∀Nused by 1

Uses Theorem 2.7 and Theorem 2.8. There is no Frey package.

Lean code for Corollary2.91 theorem
  • theoremdefined in FLT/Basic/Reductions.lean
    complete
    theorem FreyPackage.falseFreyPackage.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.falseFreyPackage.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. 
Proof

Follows immediately from the previous two theorems Theorem 2.7 and Theorem 2.8.

We deduce.

Corollary2.10
L∃∀Nused by 0

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.101 theorem
  • theoremdefined in FLT/Basic/Reductions.lean
    complete
    theorem Wiles_Taylor_WilesWiles_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_WilesWiles_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 
Proof

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 [??].