152 lines
5.4 KiB
Lean4
152 lines
5.4 KiB
Lean4
import VersoManual
|
||
import Manual.Meta
|
||
-- Minimal-Imports statt `import Mathlib`, ermittelt mit
|
||
-- `#min_imports`.
|
||
import Mathlib.Data.Nat.Prime.Int
|
||
import Mathlib.RingTheory.Polynomial.Eisenstein.Criterion
|
||
|
||
open Verso.Genre
|
||
open Verso.Genre.Manual.InlineLean
|
||
|
||
set_option pp.rawOnError true
|
||
set_option verso.docstring.allowMissing true
|
||
|
||
#doc (Manual) "Polynome und Irreduzibilität" =>
|
||
%%%
|
||
htmlSplit := .never
|
||
tag := "polynome"
|
||
file := "polynome"
|
||
%%%
|
||
|
||
Dieses Kapitel übersetzt die beiden Beispiele nach dem
|
||
Eisenstein-Kriterium aus Kapitel 7 des Skripts nach Lean; das
|
||
Kriterium selbst zitieren wir aus Mathlib. Nebenbei lernen wir die
|
||
Polynom-API kennen.
|
||
|
||
# Das Mathlib-Wörterbuch
|
||
|
||
* Der Polynomring über `R` heißt `Polynomial R`, mit der Notation
|
||
`R[X]`. Die Variable ist `X`, das konstante Polynom zu `a : R` ist
|
||
`C a`; ein Polynom wie `x³−2` schreibt sich also `X ^ 3 - C 2`.
|
||
|
||
* Der k-te Koeffizient ist `f.coeff k`, der Grad `f.degree`.
|
||
Achtung: `degree` hat Werte in `WithBot ℕ` — das Nullpolynom
|
||
bekommt den Grad `⊥` („minus unendlich“, wie im Skript). Daneben
|
||
gibt es `f.natDegree : ℕ`.
|
||
|
||
* „f ist normiert“ (Leitkoeffizient 1) ist `f.Monic`; „f ist
|
||
irreduzibel“ ist `Irreducible f`; die Bedingung „ggT der
|
||
Koeffizienten ist 1“ aus dem Eisenstein-Kriterium heißt
|
||
`f.IsPrimitive` (kein Nichteinheits-Teiler in `R`).
|
||
|
||
# Das Eisenstein-Kriterium
|
||
|
||
Satz 7.2.1 des Skripts:
|
||
|
||
> *Satz 7.2.1 (Eisenstein-Kriterium).* Es sei $`R` ein faktorieller
|
||
Ring und es sei
|
||
$`f = a_0 + a_1 \cdot x + \dots + a_n \cdot x^n \in R[x]` ein
|
||
Polynom vom Grad $`n > 0`. Weiter sei
|
||
$`\operatorname{ggT}(a_0, \dots, a_n) = 1`. Wenn es ein
|
||
Primelement $`p \in R` gibt mit $`p \mid a_0`, $`p \mid a_1`, …,
|
||
$`p \mid a_{n-1}` und $`p^2 \nmid a_0`, dann ist $`f` irreduzibel
|
||
in $`R[x]`.
|
||
|
||
In Mathlib heißt der Satz
|
||
`Polynomial.irreducible_of_eisenstein_criterion`. Er ist dort über
|
||
ein Primideal `P` statt eines Primelements $`p` formuliert — für uns
|
||
ist `P` das Hauptideal $`(p)` aus dem letzten Kapitel, und „$`p`
|
||
teilt $`a_k`“ wird zu `f.coeff k ∈ Ideal.span {p}`. Statt
|
||
„$`p \nmid a_n`“ (was im Skript aus $`\operatorname{ggT} = 1` folgt)
|
||
verlangt Mathlib direkt `f.leadingCoeff ∉ P`.
|
||
|
||
# Erstes Beispiel: xⁿ − r
|
||
|
||
> Das Polynom $`x^n - r \in \mathbb{Z}[x]` ist irreduzibel, wenn
|
||
$`r` durch eine Primzahl $`p`, aber nicht durch $`p^2` teilbar
|
||
ist.
|
||
|
||
Das Skript lässt die Kontrolle der Eisenstein-Bedingungen als
|
||
Kopfrechnung weg — in Lean führen wir sie aus und lernen dabei die
|
||
Koeffizienten-API kennen: `coeff_sub`, `coeff_X_pow` und `coeff_C`
|
||
berechnen die Koeffizienten von $`x^n - r`, nämlich $`a_n = 1`,
|
||
$`a_0 = -r` und $`a_k = 0` sonst.
|
||
|
||
```lean
|
||
open Polynomial
|
||
|
||
theorem xn_sub_r_irreduzibel (n : ℕ) (hn : 0 < n) (r : ℤ)
|
||
(p : ℕ) (hp : p.Prime) (hpr : (p : ℤ) ∣ r)
|
||
(hp2r : ¬ (p : ℤ) ^ 2 ∣ r) :
|
||
Irreducible (X ^ n - C r) := by
|
||
-- Das Primelement p des Skripts wird zum Primideal (p):
|
||
have hprime : Prime (p : ℤ) :=
|
||
Nat.prime_iff_prime_int.mp hp
|
||
have hP : (Ideal.span {(p : ℤ)}).IsPrime :=
|
||
(Ideal.span_singleton_prime hprime.ne_zero).mpr hprime
|
||
-- Grad und Leitkoeffizient von f = xⁿ − r:
|
||
have hmonic : (X ^ n - C r).Monic :=
|
||
monic_X_pow_sub_C r hn.ne'
|
||
have hdeg := degree_X_pow_sub_C hn r
|
||
apply irreducible_of_eisenstein_criterion hP
|
||
-- „p ∤ aₙ“: Der Leitkoeffizient ist 1, und p ∤ 1, weil
|
||
-- p keine Einheit ist.
|
||
· rw [hmonic.leadingCoeff, Ideal.mem_span_singleton]
|
||
exact fun h => hprime.not_isUnit (isUnit_of_dvd_one h)
|
||
-- „p|a₀, …, p|a_{n−1}“: Unterhalb von Grad n sind die
|
||
-- Koeffizienten −r (bei k = 0) und 0 (sonst) — beide
|
||
-- durch p teilbar.
|
||
· intro k hk
|
||
have hkn : k < n := by
|
||
rw [hdeg] at hk
|
||
exact_mod_cast hk
|
||
rw [coeff_sub, coeff_X_pow, if_neg hkn.ne, coeff_C,
|
||
Ideal.mem_span_singleton]
|
||
rcases eq_or_ne k 0 with h0 | h0
|
||
· subst h0
|
||
simpa using hpr
|
||
· simp [h0]
|
||
-- „… vom Grad n > 0.“
|
||
· rw [hdeg]
|
||
exact_mod_cast hn
|
||
-- „p² ∤ a₀“: Der konstante Koeffizient ist −r.
|
||
· rw [Ideal.span_singleton_pow, Ideal.mem_span_singleton,
|
||
coeff_sub, coeff_X_pow, if_neg hn.ne, coeff_C,
|
||
if_pos rfl, zero_sub, dvd_neg]
|
||
exact hp2r
|
||
-- „ggT(a₀, …, aₙ) = 1“: f ist normiert, also primitiv.
|
||
· exact hmonic.isPrimitive
|
||
```
|
||
|
||
# Bemerkungen
|
||
|
||
Mathlibs Beweis des Eisenstein-Kriteriums folgt derselben Idee wie
|
||
das Erklärvideo 9-1 des Skripts: Reduktion der Koeffizienten modulo
|
||
`p`. Auch das Gauß-Kriterium aus dem ersten Teil des Kapitels steht
|
||
in Mathlib (Datei `Mathlib.RingTheory.Polynomial.GaussLemma`). Das
|
||
zweite Beispiel des Skripts — `xⁿ − p` ist irreduzibel und deshalb
|
||
das Minimalpolynom von `ⁿ√p` — greifen wir im Kapitel über
|
||
Körpererweiterungen wieder auf.
|
||
|
||
# Übungsaufgabe
|
||
|
||
Genau dieses zweite Beispiel ist die Übung:
|
||
|
||
> Das Polynom $`x^n - p \in \mathbb{Z}[x]` ist für jede Primzahl
|
||
$`p` irreduzibel.
|
||
|
||
Wenden Sie `xn_sub_r_irreduzibel` mit `r = p` an. Zu zeigen bleibt
|
||
$`p^2 \nmid p`: Aus $`p = p^2 \cdot c` folgt durch Kürzen
|
||
$`1 = p \cdot c` — dann wäre $`p` eine Einheit, im Widerspruch zur
|
||
Primalität. Nützlich sind
|
||
`mul_left_cancel₀`, `isUnit_of_dvd_one` und `Prime.not_isUnit`.
|
||
Öffnen Sie `AlgebraInLean/Polynomials.lean` und ersetzen Sie das
|
||
`sorry` durch einen Beweis.
|
||
|
||
```lean
|
||
theorem xn_sub_p_irreduzibel (n : ℕ) (hn : 0 < n) (p : ℕ)
|
||
(hp : p.Prime) :
|
||
Irreducible (X ^ n - C (p : ℤ)) := by
|
||
sorry
|
||
```
|