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

155 lines
5.8 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`, 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
```