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 < aI 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 < aIdeal.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 < aI 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 Ib 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 / ab 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 % ab 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 + rb 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 rb 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 < ab 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 Ib 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 Ib 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 = 0b 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 = 0a 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 = 0b = 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 = 0a * 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 < aIdeal.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 < aa 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:Kr I All goals completed! 🐙