|
| 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 |
0 commit comments