Skip to content

Commit 487d366

Browse files
seewoo5riccardobrascajcpaikJineon Baek
authored andcommitted
feat: Mason-Stothers theorem (polynomial ABC) (#15706)
This file proves Mason-Stothers theorem (i.e. polynomial ABC). For coprime polynomials $a, b, c$ over a field (of arbitrary characteristic) with $a + b + c = 0$, we have $\max\{\deg(a), \deg(b), \deg(c)\} + 1 \le \deg(\mathrm{rad}(abc))$ or $a' = b' = c' = 0$. Co-authored-by: Riccardo Brasca <[email protected]> Co-authored-by: Jineon Baek <[email protected]> Co-authored-by: Jineon Baek <[email protected]> Co-authored-by: Jineon Baek <[email protected]> Co-authored-by: Seewoo Lee <[email protected]>
1 parent c9c0da4 commit 487d366

File tree

4 files changed

+91
-6
lines changed

4 files changed

+91
-6
lines changed

Mathlib.lean

+1
Original file line numberDiff line numberDiff line change
@@ -3617,6 +3617,7 @@ import Mathlib.NumberTheory.EulerProduct.Basic
36173617
import Mathlib.NumberTheory.EulerProduct.DirichletLSeries
36183618
import Mathlib.NumberTheory.FLT.Basic
36193619
import Mathlib.NumberTheory.FLT.Four
3620+
import Mathlib.NumberTheory.FLT.MasonStothers
36203621
import Mathlib.NumberTheory.FLT.Three
36213622
import Mathlib.NumberTheory.FactorisationProperties
36223623
import Mathlib.NumberTheory.Fermat
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/-
2+
Copyright (c) 2024 Jineon Baek and Seewoo Lee. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Jineon Baek, Seewoo Lee
5+
-/
6+
import Mathlib.RingTheory.Polynomial.Radical
7+
8+
/-!
9+
# Mason-Stothers theorem
10+
11+
This file states and proves the Mason-Stothers theorem, which is a polynomial version of the
12+
ABC conjecture. For (pairwise) coprime polynomials `a, b, c` (over a field) with `a + b + c = 0`,
13+
we have `max {deg(a), deg(b), deg(c)} + 1 ≤ deg(rad(abc))` or `a' = b' = c' = 0`.
14+
15+
Proof is based on this online note by Franz Lemmermeyer http://www.fen.bilkent.edu.tr/~franz/ag05/ag-02.pdf,
16+
which is essentially based on Noah Snyder's paper "An Alternative Proof of Mason's Theorem",
17+
but slightly different.
18+
19+
## TODO
20+
21+
Prove polynomial FLT using Mason-Stothers theorem.
22+
-/
23+
24+
open Polynomial UniqueFactorizationMonoid UniqueFactorizationDomain EuclideanDomain
25+
26+
variable {k : Type*} [Field k] [DecidableEq k]
27+
28+
-- we use this three times; the assumptions are symmetric in a, b, c.
29+
private theorem abc_subcall {a b c w : k[X]} {hw : w ≠ 0} (wab : w = wronskian a b) (ha : a ≠ 0)
30+
(hb : b ≠ 0) (hc : c ≠ 0) (abc_dr_dvd_w : divRadical (a * b * c) ∣ w) :
31+
c.natDegree + 1 ≤ (radical (a * b * c)).natDegree := by
32+
have ab_nz := mul_ne_zero ha hb
33+
have abc_nz := mul_ne_zero ab_nz hc
34+
-- bound the degree of `divRadical (a * b * c)` using Wronskian `w`
35+
set abc_dr := divRadical (a * b * c)
36+
have abc_dr_ndeg_lt : abc_dr.natDegree < a.natDegree + b.natDegree := by
37+
calc
38+
abc_dr.natDegree ≤ w.natDegree := Polynomial.natDegree_le_of_dvd abc_dr_dvd_w hw
39+
_ < a.natDegree + b.natDegree := by rw [wab] at hw ⊢; exact natDegree_wronskian_lt_add hw
40+
-- add the degree of `radical (a * b * c)` to both sides and rearrange
41+
set abc_r := radical (a * b * c)
42+
apply Nat.lt_of_add_lt_add_left
43+
calc
44+
a.natDegree + b.natDegree + c.natDegree = (a * b * c).natDegree := by
45+
rw [Polynomial.natDegree_mul ab_nz hc, Polynomial.natDegree_mul ha hb]
46+
_ = ((divRadical (a * b * c)) * (radical (a * b * c))).natDegree := by
47+
rw [mul_comm _ (radical _), radical_mul_divRadical (a * b * c)]
48+
_ = abc_dr.natDegree + abc_r.natDegree := by
49+
rw [← Polynomial.natDegree_mul (divRadical_ne_zero abc_nz) (radical_ne_zero (a * b * c))]
50+
_ < a.natDegree + b.natDegree + abc_r.natDegree := by
51+
exact Nat.add_lt_add_right abc_dr_ndeg_lt _
52+
53+
/-- **Polynomial ABC theorem.** -/
54+
theorem Polynomial.abc {a b c : k[X]} (ha : a ≠ 0) (hb : b ≠ 0) (hc : c ≠ 0) (hab : IsCoprime a b)
55+
(hbc : IsCoprime b c) (hca : IsCoprime c a) (hsum : a + b + c = 0) :
56+
( natDegree a + 1 ≤ (radical (a * b * c)).natDegree ∧
57+
natDegree b + 1 ≤ (radical (a * b * c)).natDegree ∧
58+
natDegree c + 1 ≤ (radical (a * b * c)).natDegree ) ∨
59+
derivative a = 0 ∧ derivative b = 0 ∧ derivative c = 0 := by
60+
set w := wronskian a b with wab
61+
have wbc : w = wronskian b c := wronskian_eq_of_sum_zero hsum
62+
have wca : w = wronskian c a := by
63+
rw [add_rotate] at hsum
64+
simpa only [← wbc] using wronskian_eq_of_sum_zero hsum
65+
-- have `divRadical x` dividing `w` for `x = a, b, c`, and use coprimality
66+
have abc_dr_dvd_w : divRadical (a * b * c) ∣ w := by
67+
have adr_dvd_w := divRadical_dvd_wronskian_left a b
68+
have bdr_dvd_w := divRadical_dvd_wronskian_right a b
69+
have cdr_dvd_w := divRadical_dvd_wronskian_right b c
70+
rw [← wab] at adr_dvd_w bdr_dvd_w
71+
rw [← wbc] at cdr_dvd_w
72+
rw [divRadical_mul (hca.symm.mul_left hbc), divRadical_mul hab]
73+
exact (hca.divRadical.symm.mul_left hbc.divRadical).mul_dvd
74+
(hab.divRadical.mul_dvd adr_dvd_w bdr_dvd_w) cdr_dvd_w
75+
by_cases hw : w = 0
76+
· right
77+
rw [hw] at wab wbc
78+
cases' hab.wronskian_eq_zero_iff.mp wab.symm with ga gb
79+
cases' hbc.wronskian_eq_zero_iff.mp wbc.symm with _ gc
80+
exact ⟨ga, gb, gc⟩
81+
· left
82+
-- use the subcall three times, using the symmetry in `a, b, c`
83+
refine ⟨?_, ?_, ?_⟩
84+
· rw [mul_rotate] at abc_dr_dvd_w ⊢
85+
apply abc_subcall wbc <;> assumption
86+
· rw [← mul_rotate] at abc_dr_dvd_w ⊢
87+
apply abc_subcall wca <;> assumption
88+
· apply abc_subcall wab <;> assumption

Mathlib/RingTheory/Polynomial/Radical.lean

+1-5
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,9 @@ This file proves some theorems on `radical` and `divRadical` of polynomials.
1414
See `RingTheory.Radical` for the definition of `radical` and `divRadical`.
1515
-/
1616

17-
noncomputable section
18-
19-
open scoped Classical
20-
2117
open Polynomial UniqueFactorizationMonoid UniqueFactorizationDomain EuclideanDomain
2218

23-
variable {k : Type*} [Field k]
19+
variable {k : Type*} [Field k] [DecidableEq k]
2420

2521
theorem divRadical_dvd_derivative (a : k[X]) : divRadical a ∣ derivative a := by
2622
induction a using induction_on_coprime

Mathlib/RingTheory/Polynomial/Wronskian.lean

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ theorem dvd_derivative_iff {a : k[X]} : a ∣ derivative a ↔ derivative a = 0
128128
For coprime polynomials `a` and `b`, their Wronskian is zero
129129
if and only if their derivatives are zeros.
130130
-/
131-
theorem IsCoprime.wronskian_eq_zero_iff {a b : k[X]} (hc : IsCoprime a b) :
131+
theorem _root_.IsCoprime.wronskian_eq_zero_iff {a b : k[X]} (hc : IsCoprime a b) :
132132
wronskian a b = 0 ↔ derivative a = 0 ∧ derivative b = 0 where
133133
mp hw := by
134134
rw [wronskian, sub_eq_iff_eq_add, zero_add] at hw

0 commit comments

Comments
 (0)