見出し画像

Lean4: FLT n=3 証明の形式化が完了?

詳細が解って、この状況は工程の1/3序盤くらいみたいです。
その後に中盤戦と後半戦がありますが、実はもう後半戦突入で…。
意外と行けるかもしれません…!(フラグ)
つまり、ここで欲する仮定の証明が成されていません。
この仮定の導出と同時に証明をして、仮定を定理、補題化すること。✍️

2026/02/25 12:15 追記


関連

前提仮定

ここで前提となる仮定を構築する補題群が出来ました。

補題チェーン(詳しくは GitHub へ)

仮定式

$$
\large
\forall q,\; \text{Prime } q \to q \mid (c^3-b^3) \to q \nmid (c-b) \to \neg q^2 \mid S0(c,b)
$$

hS0_not_sq

hS0_not_sq :
∀ {q : ℕ}, Nat.Prime q → q ∣ c ^ 3 - b ^ 3 → ¬ q ∣ c - b → ¬ q ^ 2 ∣ S0_nat c b

これを作って、定理 FLT_d3_by_padicValNat に渡せば、証明できます。

難しい理論はたぶん使ってない!

その仮定を作り出すためのフィルター補題定理群が完成したという話です。
つまりは…。たぶん。証明完了した。
(但し、3乗関連の3倍数を取り除いた数の集合において言える。くらい)


まあ、現在黙々と一人で検証中だけど。
宇宙式が一応、功を奏した結果として。

リポジトリ (nightly) で、公開中


考察

なんか、判定テスト定理として出来上がった FLT_d3_by_padicValNat ですが内部では GN 使って判定しているので n = 3 以外も素数 p で判定できる定理になるだろうということで一般化も可能な領域に居る。

その際に、仮定が一般化されるので、あらゆる仮定構築で遊べるのではないでしょうか??という話。

'DkMath.FLT.FLT_d3_by_padicValNat' depends on axioms:
[propext, Classical.choice, Quot.sound]

#print axioms

sorry は残ってない。Mathlib.FLT を直接利用してないので、MkMath 内の補題を解析すれば別視点での FLT の構造が解るかもしれない。というところ。

本格的に数学詳しくないので、もうこれ以上は数学に人生かけている人に、任せようかな。まあ、興味ある人で人生時間に余裕がある人は突っ込め!


仮定の構築の解説を note で書こうと思ったけど、他の研究もあるので、
(どんどん出てきてしまう)GitHub に *.md で、議論ログがちらほら落ちてるから拾って読んでください。


2026/02/24 17:04

D.

#FLT #フェルマーの最終定理 #仮定式 #仮定 #補題 #定理 #Lean #Lean4 #Mathlib #Mathlib4 #宇宙式 #無次元宇宙式 #GitHub #リポジトリ #nightly
#padicValNat #Markdown #議事録 #議論ログ #証明 #形式化証明


Appendix

FLT n=3 判定のための定理

-- ========================================
-- § 3. 矛盾導出(層A + 層B統合)
-- ========================================

/-- **メイン定理:別解による FLT d=3 証明**

Zsigmondy原始素因子 + padicValNat評価による背理法:
平方自由性仮定の下で、完全3乗仮定と矛盾を導出。

**入力(仮定):**
- `ha : 0 < a`, `hb : 0 < b`, `hc : 0 < c` - 正の整数
- `hab : Nat.Coprime a b` - a と b は互いに素
- `hS0_not_sq : ∀ {q : ℕ}, Nat.Prime q → q ∣ c^3 - b^3 → ¬ q ∣ c - b → ¬ q² ∣ S0_nat c b`
  - 相対多角数S0(c,b) = c²+cb+b² は各原始素因子 q に対して平方自由
  - すなわち:q が c³-b³ を割り、かつ q が (c-b) を割らない任意の素数 q について、
    q² は S0(c,b) を割らない

**証明戦略(層統合):**

1. **層A(Zsigmondy原始素因子)**
   - 存在補題により、q | (c³-b³) かつ ¬ q | (c-b) を満たす素数 q が存在

2. **層B(padicValNat上界)**
   - 仮定 hS0_not_sq から ¬ q² ∣ S0(c,b)
   - padicValNat上界:v_q(c³-b³) ≤ 1

3. **矛盾導出**
   - 完全3乗仮定:q | a より v_q(a³-b³) ≥ 3
   - 層B下界:v_q(c³-b³) = v_q(a³-b³)(cube_sub_eq_of_add_eq より)
   - 矛盾:3 ≤ v_q(c³-b³) ≤ 1

**出力(結論):**
`a³ + b³ ≠ c³`(FLT d=3)
-/
theorem FLT_d3_by_padicValNat {a b c : ℕ}
    (ha : 0 < a) (hb : 0 < b) (hc : 0 < c)
    (hab : Nat.Coprime a b)
    (hS0_not_sq :
      ∀ {q : ℕ}, Nat.Prime q → q ∣ c ^ 3 - b ^ 3 → ¬ q ∣ c - b → ¬ q ^ 2 ∣ S0_nat c b) :
    a ^ 3 + b ^ 3 ≠ c ^ 3 := by
  intro h_eq

  have hcop_cb : Nat.Coprime c b := coprime_cb_of_eq hab h_eq
  have hbc : b < c := by
    by_contra hbc_not
    have hcb : c ≤ b := Nat.not_lt.mp hbc_not
    have hc3_le : c ^ 3 ≤ b ^ 3 := Nat.pow_le_pow_left hcb 3
    have hsum_le : a ^ 3 + b ^ 3 ≤ b ^ 3 := by simpa [h_eq] using hc3_le
    have ha3_pos : 0 < a ^ 3 := by positivity
    omega

  obtain ⟨q, hq_prime, hq_dvd_diff, hq_ndiv_diff⟩ :=
    exists_prime_factor_cube_diff hbc hb hcop_cb

  have hsub : c ^ 3 - b ^ 3 = a ^ 3 := cube_sub_eq_of_add_eq h_eq
  have hq_dvd_a3 : q ∣ a ^ 3 := by simpa [hsub] using hq_dvd_diff
  have hq_dvd_a : q ∣ a := hq_prime.dvd_of_dvd_pow hq_dvd_a3

  have h_lower_a3 : 3 ≤ padicValNat q (a ^ 3) :=
    padicValNat_lower_bound_of_dvd_d3 ha hq_prime hq_dvd_a
  have h_lower : 3 ≤ padicValNat q (c ^ 3 - b ^ 3) := by
    simpa [hsub] using h_lower_a3

  have h_upper : padicValNat q (c ^ 3 - b ^ 3) ≤ 1 :=
    padicValNat_upper_bound_d3 hbc hc hb hq_prime hq_dvd_diff hq_ndiv_diff
      (hS0_not_sq hq_prime hq_dvd_diff hq_ndiv_diff)

  have : (3 : ℕ) ≤ 1 := le_trans h_lower h_upper
  omega

#print axioms FLT_d3_by_padicValNat  -- OK: 2026/02/24  6:27
-- 'DkMath.FLT.FLT_d3_by_padicValNat' depends on axioms: [propext, Classical.choice, Quot.sound]


利用例の直前補題

/--
`CounterexamplePattern.classifyLift` を経由して `hS0_not_sq` を供給する版。
-/
theorem FLT_d3_by_padicValNat_of_classifyLift {a b c : ℕ}
    (ha : 0 < a) (hb : 0 < b) (hc : 0 < c)
    (hab : Nat.Coprime a b)
    (hClassify :
      ∀ {q : ℕ}, Nat.Prime q → q ∣ c ^ 3 - b ^ 3 → ¬ q ∣ c - b →
        classifyLift ({ c := c, b := b, q := q } : CounterexampleInput) = LiftStatus.impossible) :
    a ^ 3 + b ^ 3 ≠ c ^ 3 := by
  apply FLT_d3_by_padicValNat ha hb hc hab
  intro q hq hq_dvd_diff hq_ndiv_diff
  let x : CounterexampleInput := { c := c, b := b, q := q }
  have hprim : primitivePrimeGate x := by
    exact ⟨hq, hq_dvd_diff, hq_ndiv_diff⟩
  have hcls : classifyLift x = LiftStatus.impossible := by
    simpa [x] using hClassify hq hq_dvd_diff hq_ndiv_diff
  have hnosq : noSquareGate x :=
    noSquareGate_of_classifyLift_impossible hprim hcls
  simpa [x, noSquareGate] using hnosq

#print axioms FLT_d3_by_padicValNat  -- OK: 2026/02/23 12:08
-- 'DkMath.FLT.FLT_d3_by_padicValNat' depends on axioms: [propext, Classical.choice, Quot.sound]


それで使ってる補題

/--
反例抽出器の最小判定器。

- `primitivePrimeGate` が閉じない場合は `undecided`
- 閉じていて `noSquareGate` が成り立つなら `impossible`
- 閉じていて `noSquareGate` が崩れるなら `possible`
-/
noncomputable def classifyLift (x : CounterexampleInput) : LiftStatus := by
  classical
  exact if hexc : exceptionalPhaseGate x then
    LiftStatus.undecided
  else if hprim : primitivePrimeGate x then
    if hnosq : noSquareGate x then LiftStatus.impossible else LiftStatus.possible
  else
    LiftStatus.undecided


と、言う感じで辿ってください。

いいなと思ったら応援しよう!

D. 🐺賢狼👨‍✈️Copilot のご飯代を、私には🍺代を。 または 宇宙式 $N+u^d=(P+u)^d$ を使って新しい発見を!