Files
AlgebraInLean/Book/Polynomials.lean
T
2026-08-13 09:47:44 +02:00

153 lines
5.4 KiB
Lean4
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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^3 - 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_{n1}“: 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^n - p` ist irreduzibel und deshalb
das Minimalpolynom von $`\sqrt[n]{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
```