155 lines
5.8 KiB
Lean4
155 lines
5.8 KiB
Lean4
import VersoManual
|
||
import Manual.Meta
|
||
-- Minimal-Imports statt `import Mathlib`: ermittelt mit
|
||
-- `#min_imports`, ergänzt um die Taktiken `ring` und
|
||
-- `field_simp`.
|
||
import Mathlib.Data.Int.LeastGreatest
|
||
import Mathlib.RingTheory.Ideal.Operations
|
||
import Mathlib.Tactic.Ring
|
||
import Mathlib.Tactic.FieldSimp
|
||
|
||
open Verso.Genre Manual
|
||
open Verso.Genre.Manual.InlineLean
|
||
|
||
set_option pp.rawOnError true
|
||
set_option verso.docstring.allowMissing true
|
||
|
||
#doc (Manual) "Ringe und Ideale" =>
|
||
%%%
|
||
htmlSplit := .never
|
||
tag := "ideale"
|
||
file := "ideale"
|
||
%%%
|
||
|
||
Dieses Kapitel übersetzt den Satz „ℤ ist ein Hauptidealring“ aus
|
||
Kapitel 9 des Skripts — der klassische Beweis über Division mit Rest,
|
||
und zugleich unsere erste Begegnung mit dem Wohlordnungsprinzip in
|
||
Lean.
|
||
|
||
# Das Mathlib-Wörterbuch
|
||
|
||
* Ein Ideal in einem kommutativen Ring `R` ist ein Term
|
||
`I : Ideal R`. Die beiden Bedingungen aus der Ideal-Definition des
|
||
Skripts heißen `I.add_mem` (für alle $`a, b \in I` ist
|
||
$`a+b \in I`) und
|
||
`I.mul_mem_left` (für alle $`r \in R` und $`a \in I` ist $`r \cdot a \in I`);
|
||
außerdem ist `I.zero_mem : 0 ∈ I`.
|
||
|
||
* Das von einer Menge `s` erzeugte Ideal ist `Ideal.span s`; ein
|
||
_Hauptideal_ $`(a)` ist also `Ideal.span {a}`. Die Beobachtung
|
||
„Hauptideale und Teilbarkeit“ des Skripts ist das Lemma
|
||
`Ideal.mem_span_singleton : b ∈ span {a} ↔ a ∣ b`.
|
||
|
||
* „Jedes Ideal ist endlich erzeugt / ein Hauptideal“ sind die
|
||
Prädikate `IsNoetherianRing R` und `IsPrincipalIdealRing R`.
|
||
|
||
# ℤ ist ein Hauptidealring
|
||
|
||
Satz 9.3.7 des Skripts, mit Beweis:
|
||
|
||
> Es sei $`I \subset \mathbb{Z}` ein Ideal und $`I \neq \{0\}`.
|
||
Dann gibt es ein $`x \in I \setminus \{0\}`. Beachte, dass dann
|
||
auch $`-x = (-1) \cdot x` in $`I` ist. Also enthält $`I` positive
|
||
Elemente. Sei $`a \in I` jetzt das kleinste positive Element. Wir
|
||
werden zeigen, dass $`I = (a)` ist. Die Inklusion
|
||
$`(a) \subseteq I` ist klar. Sei $`b \in I` irgendein positives
|
||
Element, dann teilen wir mit Rest: $`b = q \cdot a + r` mit
|
||
$`0 \leq r < a`. Die Zahl $`r` ist jetzt aber in $`I`, denn $`b`
|
||
und $`q \cdot a` sind in $`I`. Weiter muss wegen der Minimalität
|
||
von $`a` also $`r = 0` sein und somit $`b \in (a)`.
|
||
|
||
Zwei Anmerkungen zur Übersetzung. Das „kleinste positive Element“
|
||
liefert das Wohlordnungsprinzip, in Mathlib
|
||
`Int.exists_least_of_bdd`. Und wo das Skript nur positive $`b`
|
||
behandelt (und den Rest dem Leser überlässt), nehmen wir gleich
|
||
beliebige $`b` — die Division mit Rest in Lean funktioniert für alle
|
||
ganzen Zahlen.
|
||
|
||
```lean
|
||
theorem int_hauptidealring (I : Ideal ℤ) :
|
||
∃ a : ℤ, I = Ideal.span {a} := by
|
||
-- „… und I ≠ {0}.“ Das Nullideal erledigt a = 0:
|
||
by_cases hI : I = ⊥
|
||
· exact ⟨0, by simp [hI]⟩
|
||
-- „Dann gibt es ein x ∈ I∖{0}.“
|
||
· obtain ⟨x, hxI, hx0⟩ :=
|
||
Submodule.exists_mem_ne_zero_of_ne_bot hI
|
||
-- „Beachte, dass dann auch −x = (−1)·x in I ist. Also
|
||
-- enthält I positive Elemente.“
|
||
have hmx : -x ∈ I := by
|
||
have h := I.mul_mem_left (-1) hxI
|
||
simpa using h
|
||
have hpos : ∃ y, y ∈ I ∧ 0 < y := by
|
||
rcases lt_or_gt_of_ne hx0 with h | h
|
||
· exact ⟨-x, hmx, by omega⟩
|
||
· exact ⟨x, hxI, h⟩
|
||
-- „Sei a ∈ I jetzt das kleinste positive Element.“
|
||
obtain ⟨a, ⟨haI, ha⟩, hmin⟩ :=
|
||
Int.exists_least_of_bdd
|
||
(P := fun y => y ∈ I ∧ 0 < y)
|
||
⟨1, fun z hz => by have := hz.2; omega⟩ hpos
|
||
-- „Wir werden zeigen, dass I = (a) ist.“
|
||
refine ⟨a, le_antisymm ?_ ?_⟩
|
||
· -- „Sei b ∈ I irgendein Element, dann teilen wir mit
|
||
-- Rest: b = q·a + r mit 0 ≤ r < a.“
|
||
intro b hb
|
||
set q := b / a with hq_def
|
||
set r := b % a with hr_def
|
||
have hdiv : b = a * q + r := by
|
||
rw [hq_def, hr_def]
|
||
exact (Int.mul_ediv_add_emod b a).symm
|
||
have hr0 : 0 ≤ r := Int.emod_nonneg b (by omega)
|
||
have hra : r < a := Int.emod_lt_of_pos b ha
|
||
-- „Die Zahl r ist jetzt aber in I, denn b und q·a
|
||
-- sind in I.“
|
||
have hqaI : a * q ∈ I := I.mul_mem_right q haI
|
||
have hrI : r ∈ I := by
|
||
have hr_eq : r = b - a * q := by rw [hdiv]; ring
|
||
rw [hr_eq]
|
||
exact I.sub_mem hb hqaI
|
||
-- „Weiter muss wegen der Minimalität von a also r = 0
|
||
-- sein …“
|
||
have hr : r = 0 := by
|
||
by_contra hr
|
||
have : a ≤ r := hmin r ⟨hrI, by omega⟩
|
||
omega
|
||
-- „… und somit b ∈ (a).“
|
||
rw [Ideal.mem_span_singleton]
|
||
exact ⟨q, by rw [hdiv, hr]; ring⟩
|
||
· -- „Die Inklusion (a) ⊆ I ist klar.“
|
||
rw [Ideal.span_le, Set.singleton_subset_iff]
|
||
exact haI
|
||
```
|
||
|
||
# Bemerkungen
|
||
|
||
In Mathlib ist `IsPrincipalIdealRing ℤ` eine Instanz: ℤ ist ein
|
||
euklidischer Ring, und `EuclideanDomain.to_principal_ideal_domain`
|
||
führt genau unser Argument für beliebige euklidische Ringe. Damit
|
||
ist auch der zweite Satz des Skript-Abschnitts abgedeckt: $`K[x]` ist
|
||
euklidisch (Division mit Rest, wobei der Grad die Rolle des Betrags
|
||
übernimmt), also ein Hauptidealring. Auch der Hilbertsche Basissatz
|
||
aus diesem Kapitel steht in Mathlib: `Polynomial.isNoetherianRing`.
|
||
|
||
# Übungsaufgabe
|
||
|
||
Das Beispiel „Triviale Ideale“ des Skripts:
|
||
|
||
> Wenn $`R` ein Körper und $`I \subset R` ein Ideal ist und
|
||
$`a \in I \setminus \{0\}`, dann ist auch jedes andere
|
||
Körperelement in $`I`. Sei nämlich irgendein Element $`r \in R`
|
||
gegeben. Nach Definition ist
|
||
$`r = (r \cdot a^{-1}) \cdot a \in I`. Also ist $`I = R`.
|
||
|
||
Übersetzen Sie dieses Argument: Öffnen Sie
|
||
`AlgebraInLean/Ideals.lean` und ersetzen Sie das `sorry` durch einen
|
||
Beweis. Tipp: Die Taktik `field_simp` räumt Brüche auf; sie benutzt
|
||
dabei die Hypothese `ha0` automatisch.
|
||
|
||
```lean
|
||
theorem ideal_im_koerper {K : Type*} [Field K]
|
||
(I : Ideal K) {a : K} (haI : a ∈ I) (ha0 : a ≠ 0)
|
||
(r : K) : r ∈ I := by
|
||
sorry
|
||
```
|