Fermat's Last Theorem Blueprint

2. First Reductions Of The Problem🔗

2.1. Goal🔗

The goal of this chapter is to reduce Fermat's Last Theorem to one deep theorem of Mazur and one 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: First reductions of the problem. (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.

Code for Lemma2.11 theorem
  • theorem FermatLastTheorem.of_odd_primes
      (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
      (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.
    
    complete
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
Group: First reductions of the problem. (9)
Hover another entry in this group to preview it.
L∃∀Nused by 1

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

Code for Lemma2.21 theorem
  • theorem fermatLastTheoremThree : FermatLastTheoremForFermatLastTheoremFor (n : ℕ) : PropStatement of Fermat's Last Theorem over the naturals for a given exponent.  3
    theorem fermatLastTheoremThree :
      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`. 
    complete
Proof

The proof in mathlib was formalized by a team from the Lean For the Curious Mathematician conference held in Luminy in March 2024.

Corollary2.3
Group: First reductions of the problem. (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.

Code for Corollary2.31 theorem
  • theorem FermatLastTheorem.of_p_ge_5
      (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
      (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. 
    complete
Proof

Lemma 2.2 Lemma 2.1 Follows from the previous two lemmas.

2.4. Frey Packages🔗

For convenience we make the following definition.

Definition2.4
Group: First reductions of the problem. (9)
Hover another entry in this group to preview it.
L∃∀N
Used by 2
Hover a use site to preview it.
Preview
Lemma 2.5
Blueprint label
  • «FreyPackage.of_not_FermatLastTheorem_p_ge_5»
Uses target in
  • proof

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.

Code for Definition2.41 definition
  • structure FreyPackage : TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. 
    structure FreyPackage : 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).$
    

    Constructor

    FreyPackage.mk (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).
    ) (ha0a ≠ 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)
      (hb0b ≠ 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) (hc0c ≠ 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`.
    
     * The recommended spelling of `<=` in identifiers is `le` (prefer `≤` over `<=`). p)
      (hFLTa ^ 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)
      (hgcdabgcd a b = 1 : gcdGCDMonoid.gcd.{u_2} {α : Type u_2} {inst✝ : CommMonoidWithZero α} [self : GCDMonoid α] : α → α → αThe greatest common divisor between two elements.  a b =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↑a = 3 : a =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↑b = 0 : b =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) : 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).$
    

    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`.
    
     * The recommended spelling of `<=` in identifiers is `le` (prefer `≤` over `<=`). 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
    complete

Our next reduction is as follows.

Lemma2.5
Group: First reductions of the problem. (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.

Code for Lemma2.51 theorem
  • theorem FreyPackage.of_not_FermatLastTheorem_p_ge_5 {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`.
    
     * The recommended spelling of `<=` in identifiers is `le` (prefer `≤` over `<=`). 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
      {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`.
    
     * The recommended spelling of `<=` in identifiers is `le` (prefer `≤` over `<=`). 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. 
    complete
Proof

Suppose we have a counterexample a^p+b^p=c^p; we now build a Frey package from this data, following the arithmetic normalization recorded in Definition 2.4.

If the greatest common divisor of a, b, and c is d, then a^p+b^p=c^p implies (a/d)^p+(b/d)^p=(c/d)^p. Dividing through, we may thus assume that no prime divides all of a, b, and c. Under this assumption, the three integers are pairwise coprime, because if some prime divides two of them then the equation forces it to divide the third as well. In particular, not all of a, b, and c are even, and reducing modulo 2 shows that precisely one of them must be even.

Next we arrange that b is the even one. If a is even, we switch a and b. If c is even, we replace c by -b and b by -c, using that p is odd.

The last thing to ensure is that a is 3 modulo 4. Because b is even, we know that a is odd, so it is either 1 or 3 modulo 4. If a is already 3 modulo 4 then we are done; if a is 1 modulo 4, we replace a, b, and c by their negatives, and this gives 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. Let f(X) denote a monic cubic polynomial with rational coefficients whose three complex roots are distinct, and consider the equation E : Y^2 = f(X). This defines a curve in the (X,Y)-plane, and more precisely its projectivization is an elliptic curve over \Q.

If E : Y^2 = f(X) is an elliptic curve over \Q, and if K is any field of characteristic zero, then E(K) denotes the set of solutions to y^2=f(x) with x,y \in K, together with a point at infinity. 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 as identity. This group law is already in mathlib. It has the further property that three distinct points P, Q, and R of E(K) 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 K -> L is a homomorphism of characteristic-zero fields, then the induced map E(K) -> E(L) is a group homomorphism. If K -> L is an isomorphism, then the induced map is an isomorphism with inverse obtained from the inverse field map. This gives an action of the multiplicative group \Aut(K) of automorphisms of K on E(K), and hence on the n-torsion subgroup E(K)[n]. In particular, if \Qbar denotes an algebraic closure of \Q and \GQ denotes the group of field automorphisms \Qbar \to \Qbar, then for any elliptic curve E over \Q we obtain an action of \GQ on E(\Qbar) and hence on 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
Group: First reductions of the problem. (9)
Hover another entry in this group to preview it.
L∃∀N
Used by 2
Hover a use site to preview it.
Preview
Theorem 2.7
Blueprint label
  • Mazur_Frey
Uses target in
  • statement

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

Code for Definition2.61 definition
  • def FreyPackage.freyCurve (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 (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. 
    complete

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 let (a,b,c,p) be a Frey package. Consider the mod p representation of \GQ coming from the p-torsion in the Frey curve associated to the package, and call this representation \rho. Is \rho irreducible or not?

Theorem2.7
Group: First reductions of the problem. (9)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Definition 2.6 If \rho is the mod p Galois representation associated to a Frey package (a,b,c,p) then \rho is irreducible.

Code for Theorem2.71 theorem, incomplete
  • theorem Mazur_Frey (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 (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. 
    contains sorry in proof
Proof

[??] 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
Group: First reductions of the problem. (9)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Definition 2.6 If \rho is the mod p Galois representation associated to a Frey package (a,b,c,p) then \rho is reducible.

Code for Theorem2.81 theorem
  • theorem Wiles_Frey (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 (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. 
    complete
Proof

Theorem 3.2 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
Group: First reductions of the problem. (9)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Theorem 2.7 Theorem 2.8 There is no Frey package.

Code for Corollary2.91 theorem
  • theorem FreyPackage.false (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 (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. 
    complete
Proof

Follows immediately from the previous two theorems.

We deduce.

Corollary2.10
Group: First reductions of the problem. (9)
Hover another entry in this group to preview it.
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.

Code for Corollary2.101 theorem
  • theorem Wiles_Taylor_Wiles : 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 : 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 
    complete
Proof

Assume there is a counterexample a^n+b^n=c^n. By Corollary 2.3, we may assume that there is also a counterexample of the form a^p+b^p=c^p, where p is prime and p \ge 5. 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 Wiles_Frey. We start on this proof in the next chapter.