Algebra in Lean

3. Ringe und Ideale🔗

Dieses Kapitel übersetzt den Satz „ℤ ist ein Hauptidealring“ aus Kapitel 9 des Skripts. Es ist der klassische Beweis über Division mit Rest und zugleich unsere erste Begegnung mit dem Wohlordnungsprinzip in Lean.

3.1. 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.

3.2. ℤ 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.

theorem int_hauptidealring (I : Ideal ℤ) : ∃ a : ℤ, I = Ideal.span {a} := I:Ideal ℤ⊢ ∃ a, I = Ideal.span {a} -- „… und I ≠ {0}.“ Das Nullideal erledigt a = 0: I:Ideal ℤhI:I = ⊥⊢ ∃ a, I = Ideal.span {a}I:Ideal ℤhI:¬I = ⊥⊢ ∃ a, I = Ideal.span {a} I:Ideal ℤhI:I = ⊥⊢ ∃ a, I = Ideal.span {a} exact ⟨0, I:Ideal ℤhI:I = ⊥⊢ I = Ideal.span {0} All goals completed! 🐙⟩ -- „Dann gibt es ein x ∈ I∖{0}.“ I:Ideal ℤhI:¬I = ⊥⊢ ∃ a, I = Ideal.span {a} I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0⊢ ∃ a, I = Ideal.span {a} -- „Beachte, dass dann auch −x = (−1)·x in I ist. Also -- enthält I positive Elemente.“ I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ I⊢ ∃ a, I = Ideal.span {a} I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < y⊢ ∃ a, I = Ideal.span {a} -- „Sei a ∈ I jetzt das kleinste positive Element.“ I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < a⊢ ∃ a, I = Ideal.span {a} -- „Wir werden zeigen, dass I = (a) ist.“ I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < a⊢ I ≤ Ideal.span {a}I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < a⊢ Ideal.span {a} ≤ I I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < a⊢ I ≤ Ideal.span {a} -- „Sei b ∈ I irgendein Element, dann teilen wir mit -- Rest: b = q·a + r mit 0 ≤ r < a.“ I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < ab:ℤhb:b ∈ I⊢ b ∈ Ideal.span {a} I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < ab:ℤhb:b ∈ Iq:ℤ := b / ahq_def:q = b / a⊢ b ∈ Ideal.span {a} I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < ab:ℤhb:b ∈ Iq:ℤ := b / ahq_def:q = b / ar:ℤ := b % ahr_def:r = b % a⊢ b ∈ Ideal.span {a} I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < ab:ℤhb:b ∈ Iq:ℤ := b / ahq_def:q = b / ar:ℤ := b % ahr_def:r = b % ahdiv:b = a * q + r⊢ b ∈ Ideal.span {a} I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < ab:ℤhb:b ∈ Iq:ℤ := b / ahq_def:q = b / ar:ℤ := b % ahr_def:r = b % ahdiv:b = a * q + rhr0:0 ≤ r⊢ b ∈ Ideal.span {a} I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < ab:ℤhb:b ∈ Iq:ℤ := b / ahq_def:q = b / ar:ℤ := b % ahr_def:r = b % ahdiv:b = a * q + rhr0:0 ≤ rhra:r < a⊢ b ∈ Ideal.span {a} -- „Die Zahl r ist jetzt aber in I, denn b und q·a -- sind in I.“ I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < ab:ℤhb:b ∈ Iq:ℤ := b / ahq_def:q = b / ar:ℤ := b % ahr_def:r = b % ahdiv:b = a * q + rhr0:0 ≤ rhra:r < ahqaI:a * q ∈ I⊢ b ∈ Ideal.span {a} I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < ab:ℤhb:b ∈ Iq:ℤ := b / ahq_def:q = b / ar:ℤ := b % ahr_def:r = b % ahdiv:b = a * q + rhr0:0 ≤ rhra:r < ahqaI:a * q ∈ IhrI:r ∈ I⊢ b ∈ Ideal.span {a} -- „Weiter muss wegen der Minimalität von a also r = 0 -- sein …“ I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < ab:ℤhb:b ∈ Iq:ℤ := b / ahq_def:q = b / ar:ℤ := b % ahr_def:r = b % ahdiv:b = a * q + rhr0:0 ≤ rhra:r < ahqaI:a * q ∈ IhrI:r ∈ Ihr:r = 0⊢ b ∈ Ideal.span {a} -- „… und somit b ∈ (a).“ I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < ab:ℤhb:b ∈ Iq:ℤ := b / ahq_def:q = b / ar:ℤ := b % ahr_def:r = b % ahdiv:b = a * q + rhr0:0 ≤ rhra:r < ahqaI:a * q ∈ IhrI:r ∈ Ihr:r = 0⊢ a ∣ b exact ⟨q, I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < ab:ℤhb:b ∈ Iq:ℤ := b / ahq_def:q = b / ar:ℤ := b % ahr_def:r = b % ahdiv:b = a * q + rhr0:0 ≤ rhra:r < ahqaI:a * q ∈ IhrI:r ∈ Ihr:r = 0⊢ b = a * q I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < ab:ℤhb:b ∈ Iq:ℤ := b / ahq_def:q = b / ar:ℤ := b % ahr_def:r = b % ahdiv:b = a * q + rhr0:0 ≤ rhra:r < ahqaI:a * q ∈ IhrI:r ∈ Ihr:r = 0⊢ a * q + 0 = a * q; All goals completed! 🐙⟩ I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < a⊢ Ideal.span {a} ≤ I -- „Die Inklusion (a) ⊆ I ist klar.“ I:Ideal ℤhI:¬I = ⊥x:ℤhxI:x ∈ Ihx0:x ≠ 0hmx:-x ∈ Ihpos:∃ y ∈ I, 0 < ya:ℤhmin:∀ (z : ℤ), z ∈ I ∧ 0 < z → a ≤ zhaI:a ∈ Iha:0 < a⊢ a ∈ ↑I All goals completed! 🐙

3.3. 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.

3.4. Ü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.

theorem declaration uses `sorry`ideal_im_koerper {K : Type*} [Field K] (I : Ideal K) {a : K} (haI : a ∈ I) (ha0 : a ≠ 0) (r : K) : r ∈ I := K:Type u_1inst✝:Field KI:Ideal Ka:KhaI:a ∈ Iha0:a ≠ 0r:K⊢ r ∈ I All goals completed! 🐙