133 lines
4.6 KiB
Lean4
133 lines
4.6 KiB
Lean4
import VersoManual
|
||
import Manual.Meta
|
||
-- Minimal-Imports statt `import Mathlib`: ermittelt mit
|
||
-- `#min_imports`, ergänzt um die Taktik `ring`.
|
||
import Mathlib.Algebra.Field.ZMod
|
||
import Mathlib.Data.Nat.Choose.Dvd
|
||
import Mathlib.Data.Nat.Choose.Sum
|
||
import Mathlib.Tactic.Ring
|
||
|
||
open Verso.Genre
|
||
open Verso.Genre.Manual.InlineLean
|
||
|
||
set_option pp.rawOnError true
|
||
set_option verso.docstring.allowMissing true
|
||
|
||
#doc (Manual) "Endliche Körper und der Frobenius" =>
|
||
%%%
|
||
htmlSplit := .never
|
||
tag := "frobenius"
|
||
file := "frobenius"
|
||
%%%
|
||
|
||
Dieses Kapitel übersetzt den Satz über den Frobenius-Endomorphismus
|
||
aus Kapitel 14 des Skripts Satz für Satz nach Lean — den „Traum jedes
|
||
Studienanfängers“: $`(a+b)^p = a^p + b^p`.
|
||
|
||
# Das Mathlib-Wörterbuch
|
||
|
||
* „$`R` hat Charakteristik $`p`“ ist die Typklasse `CharP R p`.
|
||
Das entscheidende Lemma ist `CharP.cast_eq_zero`: Das Bild von
|
||
$`p` in $`R` ist Null.
|
||
|
||
* Binomialkoeffizienten heißen `Nat.choose`; die binomische Formel
|
||
ist `add_pow`, eine Summe über `Finset.range`. Endliche Summen und
|
||
ihre Umformungen sind das Lean-Lernthema dieses Kapitels.
|
||
|
||
# Der Frobenius-Endomorphismus
|
||
|
||
Satz und Definition 14.2.2 des Skripts:
|
||
|
||
> *Satz und Definition 14.2.2 (Frobenius-Endomorphismus).* Es sei
|
||
$`p` eine Primzahl und es sei $`R` ein kommutativer Ring mit Eins
|
||
der Charakteristik $`p`. Dann ist die Abbildung
|
||
$`F : R \to R`, $`a \mapsto a^p` ein Ringmorphismus.
|
||
|
||
> _Beweis._ Die Verträglichkeit mit der Multiplikation ist klar,
|
||
weil $`R` kommutativ ist: $`(a \cdot b)^p = a^p \cdot b^p`.
|
||
Ebenso ist $`F(1) = 1`. Interessant ist nur die Verträglichkeit
|
||
mit der Addition. … Die binomische Formel gilt in jedem
|
||
kommutativen Ring, also ist
|
||
$`(a+b)^p = \sum_{k=0}^{p} \binom{p}{k} \cdot a^k \cdot b^{p-k}`.
|
||
Für alle Indizes $`0 < k < p` ist der Binomialkoeffizient
|
||
$`\binom{p}{k}` ein Vielfaches von $`p` …. Weil $`R` die
|
||
Charakteristik $`p` hat, ist $`p = 0` in $`R`, und alle diese
|
||
Summanden verschwinden. Übrig bleiben nur die Summanden für
|
||
$`k = 0` und $`k = p`.
|
||
|
||
```lean
|
||
theorem frobenius_mul {R : Type*} [CommRing R] (p : ℕ)
|
||
(a b : R) : (a * b) ^ p = a ^ p * b ^ p :=
|
||
mul_pow a b p
|
||
|
||
theorem frobenius_add {R : Type*} [CommRing R] (p : ℕ)
|
||
[Fact p.Prime] [CharP R p] (a b : R) :
|
||
(a + b) ^ p = a ^ p + b ^ p := by
|
||
have hp : p.Prime := Fact.out
|
||
-- „Die binomische Formel gilt in jedem kommutativen
|
||
-- Ring, also ist
|
||
-- (a+b)^p = ∑ₖ (p über k)·a^k·b^{p−k}.“
|
||
rw [add_pow]
|
||
-- „Für alle Indizes 0 < k < p ist der
|
||
-- Binomialkoeffizient (p über k) ein Vielfaches von p
|
||
-- …. Weil R die Charakteristik p hat, ist p = 0 in
|
||
-- R, und alle diese Summanden verschwinden.“
|
||
have hmid : ∀ k ∈ Finset.Ioo 0 p,
|
||
a ^ k * b ^ (p - k) * (p.choose k : R) = 0 := by
|
||
intro k hk
|
||
obtain ⟨hk0, hkp⟩ := Finset.mem_Ioo.mp hk
|
||
obtain ⟨c, hc⟩ :=
|
||
hp.dvd_choose_self (by omega) hkp
|
||
rw [hc]
|
||
push_cast
|
||
rw [CharP.cast_eq_zero R p]
|
||
ring
|
||
-- „Übrig bleiben nur die Summanden für k = 0 und k = p.“
|
||
have hsplit : Finset.range (p + 1)
|
||
= {0, p} ∪ Finset.Ioo 0 p := by
|
||
ext k
|
||
simp only [Finset.mem_range, Finset.mem_union,
|
||
Finset.mem_insert, Finset.mem_singleton,
|
||
Finset.mem_Ioo]
|
||
omega
|
||
have hdisj : Disjoint ({0, p} : Finset ℕ)
|
||
(Finset.Ioo 0 p) := by
|
||
rw [Finset.disjoint_left]
|
||
intro k hk hk'
|
||
simp only [Finset.mem_insert,
|
||
Finset.mem_singleton] at hk
|
||
simp only [Finset.mem_Ioo] at hk'
|
||
omega
|
||
rw [hsplit, Finset.sum_union hdisj,
|
||
Finset.sum_pair (Ne.symm hp.ne_zero),
|
||
Finset.sum_eq_zero hmid, add_zero]
|
||
-- „(a+b)^p = (p über 0)·a⁰·b^p + (p über p)·a^p·b⁰
|
||
-- = a^p + b^p.“
|
||
simp [Nat.choose_zero_right, Nat.choose_self, add_comm]
|
||
```
|
||
|
||
# Bemerkungen
|
||
|
||
Mathlib bündelt die drei Verträglichkeiten zum Ringmorphismus
|
||
`frobenius R p : R →+* R`; die Additivität heißt dort
|
||
`add_pow_char`. Die Beobachtung des Skripts — über einem
|
||
Integritätsring ist der Frobenius injektiv, über einem endlichen
|
||
Körper sogar bijektiv — führt zur Klassifikation endlicher Körper:
|
||
Zu jeder Primzahlpotenz `p^n` gibt es genau einen Körper mit `p^n`
|
||
Elementen. In Mathlib heißt er `GaloisField p n`.
|
||
|
||
# Übungsaufgabe
|
||
|
||
Der Frobenius des Körpers $`\mathbb{F}_p` ist die Identität: Für
|
||
jedes $`a \in \mathbb{F}_p` ist $`a^p = a`. Das ist ein alter
|
||
Bekannter — der kleine
|
||
Satz von Fermat aus unserem dritten Kapitel! In Mathlib heißt er
|
||
`ZMod.pow_card`. Öffnen Sie `AlgebraInLean/Frobenius.lean` und
|
||
ersetzen Sie das `sorry` durch einen Beweis.
|
||
|
||
```lean
|
||
theorem frobenius_zmod (p : ℕ) [Fact p.Prime]
|
||
(a : ZMod p) : a ^ p = a := by
|
||
sorry
|
||
```
|