Gradformel

This commit is contained in:
Stefan Kebekus
2026-08-13 06:38:24 +02:00
parent d78114a107
commit f18fe0e112
6 changed files with 354 additions and 263 deletions
+1
View File
@@ -5,6 +5,7 @@ import AlgebraInLean.Ideals
import AlgebraInLean.Polynomials
import AlgebraInLean.Degrees
import AlgebraInLean.Elements
import AlgebraInLean.Transitivity
import AlgebraInLean.LittleFermat
import AlgebraInLean.Cauchy
import AlgebraInLean.Frobenius
+12 -45
View File
@@ -4,8 +4,7 @@ Algebra in Lean — Kapitel 3 des Skripts
Diese Datei begleitet das Skript „Algebra und Zahlentheorie“
(Stefan Kebekus, CC-BY 4.0). Sie übersetzt den Satz über den
Grad eines Elements (satz:3-5-4) und die Transitivität der
Algebraizität (kor:TdA) nach Lean.
Grad eines Elements (satz:3-5-4) nach Lean.
-/
import Mathlib
@@ -14,7 +13,7 @@ namespace AlgebraInLean
open IntermediateField
/-!
# Algebraische Elemente und Transitivität
# Der Grad eines Elements
## Das Mathlib-Wörterbuch
@@ -58,55 +57,23 @@ theorem grad_element {K L : Type*} [Field K] [Field L]
Fintype.card_fin]
rfl
/-!
## Die Transitivität der Algebraizität
Korollar 3.7.1 des Skripts: „Es seien L/K und M/L zwei
algebraische Körpererweiterungen. Dann ist auch M/K
algebraisch.“
Der Kern des Skript-Beweises — adjungiere die endlich vielen
Koeffizienten des Minimalpolynoms, schließe auf Endlichkeit und
klettere mit der Gradformel den Turm hinauf — ist in Mathlib
das Lemma `isIntegral_trans`.
-/
theorem transitivitaet (K L M : Type*) [Field K] [Field L]
[Field M] [Algebra K L] [Algebra L M] [Algebra K M]
[IsScalarTower K L M]
[Algebra.IsAlgebraic K L] [Algebra.IsAlgebraic L M] :
Algebra.IsAlgebraic K M := by
constructor
-- „Es sei ein Element m ∈ M gegeben.“
intro m
-- „Wir wissen, dass m algebraisch über L ist“ — über
-- Körpern gleichbedeutend: m ist ganz über L.
have hm : IsIntegral L m :=
(Algebra.IsAlgebraic.isAlgebraic m).isIntegral
-- Ebenso ist die algebraische Erweiterung L/K ganz.
have : Algebra.IsIntegral K L :=
Algebra.IsAlgebraic.isIntegral
-- „Betrachte jetzt den Körper Z := K(λ₀, …, λ_{n-1}) und
-- die Kette K ⊆ Z ⊆ Z(m) ∋ m …“ — der gesamte Rest
-- des Skript-Beweises ist das Lemma isIntegral_trans.
exact (isIntegral_trans m hm).isAlgebraic
/-!
## Übungsaufgabe
Aus dem Skript: „Die Menge der über K algebraischen Elemente
von L bildet einen Unterkörper von L, genannt der algebraische
Abschluss von K im Oberkörper L.“ Die einzelnen
Abgeschlossenheiten kennt Mathlib als `IsIntegral.add`,
`IsIntegral.neg`, `IsIntegral.mul`, `IsIntegral.pow` und
`IsIntegral.inv`. Die Übung: Kombinieren Sie sie und ersetzen
Sie das `sorry` durch einen Beweis.
Das erste Korollar des Skripts zu Satz 3.5.4: „Es sei L/K eine
Körpererweiterung und es sei a ∈ L. Falls [a:K] < ∞ ist, dann
ist K(a) algebraisch über K.“ Die beiden Zutaten kennt Mathlib
als `IntermediateField.adjoin.finiteDimensional` und
`Algebra.IsAlgebraic.of_finite`; die Endlichkeit muss mit
`have := …` in den Kontext geholt werden, damit die
Instanzsuche sie sieht. Ersetzen Sie das `sorry` durch einen
Beweis.
-/
theorem algebraisch_quadrat {K L : Type*} [Field K]
theorem einfach_algebraisch {K L : Type*} [Field K]
[Field L] [Algebra K L] {a : L}
(ha : IsIntegral K a) :
IsIntegral K (a ^ 2 + a) := by
Algebra.IsAlgebraic K Ka := by
sorry
end AlgebraInLean
+67
View File
@@ -0,0 +1,67 @@
/-
Algebra in Lean — Kapitel 3 des Skripts
=======================================
Diese Datei begleitet das Skript „Algebra und Zahlentheorie“
(Stefan Kebekus, CC-BY 4.0). Sie übersetzt die Transitivität
der Algebraizität (kor:TdA) nach Lean.
-/
import Mathlib
namespace AlgebraInLean
open IntermediateField
/-!
# Die Transitivität der Algebraizität
Korollar 3.7.1 des Skripts: „Es seien L/K und M/L zwei
algebraische Körpererweiterungen. Dann ist auch M/K
algebraisch.“
Der Kern des Skript-Beweises — adjungiere die endlich vielen
Koeffizienten des Minimalpolynoms, schließe auf Endlichkeit und
klettere mit der Gradformel den Turm hinauf — ist in Mathlib
das Lemma `isIntegral_trans`. Das Mathlib-Wörterbuch aus
`AlgebraInLean/Elements.lean` gilt unverändert weiter.
-/
theorem transitivitaet (K L M : Type*) [Field K] [Field L]
[Field M] [Algebra K L] [Algebra L M] [Algebra K M]
[IsScalarTower K L M]
[Algebra.IsAlgebraic K L] [Algebra.IsAlgebraic L M] :
Algebra.IsAlgebraic K M := by
constructor
-- „Es sei ein Element m ∈ M gegeben.“
intro m
-- „Wir wissen, dass m algebraisch über L ist“ — über
-- Körpern gleichbedeutend: m ist ganz über L.
have hm : IsIntegral L m :=
(Algebra.IsAlgebraic.isAlgebraic m).isIntegral
-- Ebenso ist die algebraische Erweiterung L/K ganz.
have : Algebra.IsIntegral K L :=
Algebra.IsAlgebraic.isIntegral
-- „Betrachte jetzt den Körper Z := K(λ₀, …, λ_{n-1}) und
-- die Kette K ⊆ Z ⊆ Z(m) ∋ m …“ — der gesamte Rest
-- des Skript-Beweises ist das Lemma isIntegral_trans.
exact (isIntegral_trans m hm).isAlgebraic
/-!
## Übungsaufgabe
Aus dem Skript: „Die Menge der über K algebraischen Elemente
von L bildet einen Unterkörper von L, genannt der algebraische
Abschluss von K im Oberkörper L.“ Die einzelnen
Abgeschlossenheiten kennt Mathlib als `IsIntegral.add`,
`IsIntegral.neg`, `IsIntegral.mul`, `IsIntegral.pow` und
`IsIntegral.inv`. Die Übung: Kombinieren Sie sie und ersetzen
Sie das `sorry` durch einen Beweis.
-/
theorem algebraisch_quadrat {K L : Type*} [Field K]
[Field L] [Algebra K L] {a : L}
(ha : IsIntegral K a) :
IsIntegral K (a ^ 2 + a) := by
sorry
end AlgebraInLean
+3
View File
@@ -8,6 +8,7 @@ import Book.Ideals
import Book.Polynomials
import Book.Degrees
import Book.Elements
import Book.Transitivity
import Book.LittleFermat
import Book.Cauchy
import Book.Frobenius
@@ -75,6 +76,8 @@ oder der ausführlichen Anleitung am Anfang der
{include 0 Book.Elements}
{include 0 Book.Transitivity}
{include 0 Book.LittleFermat}
{include 0 Book.Cauchy}
+25 -218
View File
@@ -13,18 +13,19 @@ open Verso.Genre.Manual.InlineLean
set_option pp.rawOnError true
set_option verso.docstring.allowMissing true
#doc (Manual) "Algebraische Elemente und Transitivität" =>
#doc (Manual) "Der Grad eines Elements" =>
%%%
htmlSplit := .never
tag := "elemente"
file := "elemente"
%%%
Dieses Kapitel übersetzt zwei weitere Resultate aus Kapitel 3 des
Skripts nach Lean: den Satz über den Grad einer einfachen
algebraischen Erweiterung, $`[a:K] = [K(a):K]`, und die
Transitivität der Algebraizität. Beide bauen auf der Gradformel
aus dem letzten Kapitel auf.
Dieses Kapitel übersetzt Satz 3.5.4 des Skripts nach Lean: Für
ein algebraisches Element $`a` stimmt der Grad $`[a:K]` des
Minimalpolynoms mit dem Grad $`[K(a):K]` der erzeugten
Körpererweiterung überein. Zusammen mit der Gradformel aus dem
letzten Kapitel ist das das Arbeitspferd für das nächste
Kapitel, die Transitivität der Algebraizität.
# Das Mathlib-Wörterbuch
@@ -51,10 +52,10 @@ aus dem letzten Kapitel auf.
`Algebra.IsAlgebraic K L`. Das elementweise Ausbuchstabieren
übernimmt `Algebra.IsAlgebraic.isAlgebraic`.
# Der Grad eines Elements
# Satz 3.5.4
Satz 3.5.4 des Skripts verbindet den Grad eines Elements mit dem
Grad der von ihm erzeugten Körpererweiterung:
Der Satz verbindet den Grad eines Elements mit dem Grad der von
ihm erzeugten Körpererweiterung:
> *Satz 3.5.4 (Grad von Körpererweiterungen und Grad von
Elementen).* Es sei $`L/K` eine Körpererweiterung und es sei
@@ -104,114 +105,32 @@ Mathlibs 0-Konvention steht auf beiden Seiten schlicht 0. Als
fertiges Zitat heißt unser Satz übrigens
`IntermediateField.adjoin.finrank`.
# Die Transitivität der Algebraizität
Das Hauptresultat von Kapitel 3 des Skripts:
> *Korollar 3.7.1 (Transitivität der Algebraizität).* Es seien
$`L/K` und $`M/L` zwei algebraische Körpererweiterungen. Dann
ist auch $`M/K` algebraisch.
> _Beweis._ Es sei ein Element $`m M` gegeben. Wir wissen,
dass $`m` algebraisch über $`L` ist; es sei
$`f(x) = λ_0 + λ_1 x + + λ_{n-1} x^{n-1} + x^n` das
Minimalpolynom von $`m` über $`L`. Die Koeffizienten $`λ_i`
liegen in $`L`. Betrachte jetzt den Körper
$`Z := K(λ_0, , λ_{n-1})` und die Kette von
Körpererweiterungen $`K Z Z(m) m`. Die Erweiterung
$`L/K` ist algebraisch, also sind die endlich vielen Elemente
$`λ_0, , λ_{n-1}` allesamt algebraisch über $`K`; deshalb ist
$`[Z:K] < `. Weiter liegt das Polynom $`f` in $`Z[x]` und
hat $`m` als Nullstelle. Also ist $`m` auch algebraisch über
$`Z`, und Satz 3.5.4 liefert $`[Z(m):Z] < `. Mit der
Gradformel folgt $`[Z(m):K] = [Z(m):Z]·[Z:K] < `. Also ist
die Erweiterung $`Z(m)/K` algebraisch; insbesondere ist das
Element $`m Z(m)` algebraisch über $`K`.
Genau dieses Argument adjungiere die endlich vielen
Koeffizienten des Minimalpolynoms, schließe auf Endlichkeit und
klettere mit der Gradformel den Turm hinauf steckt in Mathlib
im Lemma `isIntegral_trans`. Unser Beweis übersetzt die
Rahmensätze des Skripts und zitiert für den Kern dieses Lemma;
der letzte Abschnitt des Kapitels führt auch diesen Beweis
Satz für Satz aus:
```lean
theorem transitivitaet (K L M : Type*) [Field K] [Field L]
[Field M] [Algebra K L] [Algebra L M] [Algebra K M]
[IsScalarTower K L M]
[Algebra.IsAlgebraic K L] [Algebra.IsAlgebraic L M] :
Algebra.IsAlgebraic K M := by
constructor
-- „Es sei ein Element m ∈ M gegeben.“
intro m
-- „Wir wissen, dass m algebraisch über L ist“ — über
-- Körpern gleichbedeutend: m ist ganz über L.
have hm : IsIntegral L m :=
(Algebra.IsAlgebraic.isAlgebraic m).isIntegral
-- Ebenso ist die algebraische Erweiterung L/K ganz.
have : Algebra.IsIntegral K L :=
Algebra.IsAlgebraic.isIntegral
-- „Betrachte jetzt den Körper Z := K(λ₀, …, λ_{n-1}) und
-- die Kette K ⊆ Z ⊆ Z(m) ∋ m …“ — der gesamte Rest
-- des Skript-Beweises ist das Lemma isIntegral_trans.
exact (isIntegral_trans m hm).isAlgebraic
```
Das Skript warnt an dieser Stelle:
> *Warnung (Prüfungsfalle).* Der Satz über die Transitivität der
Algebraizität wird in Prüfungen sehr gern gefragt. Beachten
Sie, dass der Beweis ziemlich indirekt ist. In Prüfungen
sehen wir oft, dass Kandidatinnen und Kandidaten für ein
gegebenes $`a M` direkt ein Minimalpolynom konstruieren
wollen. Das hat in der Geschichte der Mathematik noch in
keiner Prüfung funktioniert. Lassen Sie das!
Die Warnung gilt wortgleich in Lean: Auch Mathlib konstruiert
nirgendwo ein Minimalpolynom von $`m` über $`K` der Beweis von
`isIntegral_trans` läuft über die Endlichkeit von Moduln, nicht
über explizite Polynome.
# Bemerkungen
1. Wer in den Beweis von `isIntegral_trans` hineinschaut, findet
die Schritte des Skripts wieder: Dort wird die von den
Koeffizienten des Minimalpolynoms erzeugte Unteralgebra
gebildet (das $`Z` des Skripts), ihre Endlichkeit als Modul
gezeigt, und am Ende die Endlichkeit längs des Turms
komponiert `Module.Finite.trans`, die Gradformel in der
Gestalt endlich über endlich ist endlich.
2. Als fertiges Zitat ist die Transitivität in Mathlib die
Instanz `Algebra.IsAlgebraic.trans K L M` eine Zeile.
# Übungsaufgabe
Das Skript zieht aus der Transitivität eine schöne Folgerung:
Das erste Korollar des Skripts zu Satz 3.5.4:
> *Satz und Definition (Algebraischer Abschluss in einem
Oberkörper).* Es sei $`L/K` eine Körpererweiterung. Dann
bildet die Menge
$`\overline{K} := \{ a L : a \text{ ist algebraisch über } K \}`
einen Unterkörper von $`L`, genannt der _algebraische
Abschluss von $`K` im Oberkörper $`L`_.
> Es sei $`L/K` eine Körpererweiterung und es sei $`a L`.
Falls $`[a:K] < ` ist, dann ist $`K(a)` algebraisch
über $`K`.
Die einzelnen Abgeschlossenheiten kennt Mathlib als
`IsIntegral.add`, `IsIntegral.neg`, `IsIntegral.mul`,
`IsIntegral.pow` und `IsIntegral.inv`. Die Übung: Kombinieren
Sie sie. Öffnen Sie `AlgebraInLean/Elements.lean` und ersetzen
Sie das `sorry` durch einen Beweis.
Die beiden Zutaten kennt Mathlib als
`IntermediateField.adjoin.finiteDimensional` (der Grad ist
endlich) und `Algebra.IsAlgebraic.of_finite` (endliche
Erweiterungen sind algebraisch). Beachten Sie, dass die
Endlichkeit mit `have := ` in den Kontext geholt werden muss,
damit die Instanzsuche sie sieht. Öffnen Sie
`AlgebraInLean/Elements.lean` und ersetzen Sie das `sorry`
durch einen Beweis.
```lean
theorem algebraisch_quadrat {K L : Type*} [Field K]
theorem einfach_algebraisch {K L : Type*} [Field K]
[Field L] [Algebra K L] {a : L}
(ha : IsIntegral K a) :
IsIntegral K (a ^ 2 + a) := by
Algebra.IsAlgebraic K Ka := by
sorry
```
# Der vollständige Beweis von Satz 3.5.4
# Der vollständige Beweis
Oben haben wir die eigentliche Arbeit die Potenzen bilden eine
Basis von $`K(a)` bei `IntermediateField.adjoin.powerBasis`
@@ -578,115 +497,3 @@ theorem grad_element_vollstaendig {a : L}
rw [finrank_span_eq_card (potenzen_unabhaengig ha),
Fintype.card_fin]
```
# Der vollständige Beweis der Transitivität
Zum Schluss der Skript-Beweis der Transitivität, ohne das Zitat
von `isIntegral_trans` die Kette $`K Z Z(m) m` wird
wörtlich nachgebaut. Das komplette Skript-Zitat steht oben;
im Beweis stehen die Sätze wie immer als Kommentare. Drei
Übersetzungsentscheidungen vorweg:
* Die Koeffizienten $`λ_i` des Minimalpolynoms liegen in $`L`;
das Skript liest sie stillschweigend als Elemente von $`M`.
In Lean geschieht das explizit über die Einbettung
`algebraMap L M`. Die endliche Menge der Koeffizienten eines
Polynoms heißt `Polynomial.coeffs`.
* $`f` liegt in $`Z[x]` ist in Lean ein echter
Übersetzungsschritt: `Polynomial.toSubring` fasst ein Polynom,
dessen Koeffizienten in einem Teilring liegen, als Polynom
über diesem Teilring auf.
* Das Skript zitiert zweimal Satz 3.6.5 (endlich erzeugt von
algebraischen Elementen endlich algebraisch); in Mathlib
sind das `IntermediateField.finiteDimensional_adjoin` und
`Algebra.IsAlgebraic.of_finite`. Die Gradformel steckt in
`FiniteDimensional.trans`.
```lean
theorem transitivitaet_vollstaendig (K L M : Type*)
[Field K] [Field L] [Field M] [Algebra K L]
[Algebra L M] [Algebra K M] [IsScalarTower K L M]
[Algebra.IsAlgebraic K L] [Algebra.IsAlgebraic L M] :
Algebra.IsAlgebraic K M := by
constructor
-- „Es sei ein Element m ∈ M gegeben.“
intro x
-- „Wir wissen, dass m algebraisch über L ist; es sei f
-- das Minimalpolynom von m über L.“
have hxL : IsIntegral L x :=
(Algebra.IsAlgebraic.isAlgebraic x).isIntegral
-- „Die Koeffizienten λᵢ liegen in L.“ — wir fassen sie
-- über die Einbettung L → M als Elemente von M auf.
set S : Set M :=
algebraMap L M '' (minpoly L x).coeffs
-- „Betrachte jetzt den Körper Z := K(λ₀, …, λ_{n-1})“
set Z : IntermediateField K M :=
IntermediateField.adjoin K S
-- „Die Erweiterung L/K ist algebraisch, also sind die
-- endlich vielen Elemente λ₀, …, λ_{n-1} allesamt
-- algebraisch über K.“
have hS : s S, IsIntegral K s := by
rintro _ c, _, rfl
exact ((Algebra.IsAlgebraic.isAlgebraic
(R := K) c).isIntegral).map
(IsScalarTower.toAlgHom K L M)
have hSfin : S.Finite :=
Set.Finite.image _ (minpoly L x).coeffs.finite_toSet
have : Finite S := hSfin.to_subtype
-- „Satz 3.6.5 sagt deshalb, dass [Z:K] < ∞ ist.“
have hZfin : FiniteDimensional K Z :=
IntermediateField.finiteDimensional_adjoin hS
-- „Weiter liegt das Polynom f in Z[x] und hat m als
-- Nullstelle. Also ist m auch algebraisch über Z.“
have hxZ : IsIntegral Z x := by
have hco : (((minpoly L x).map (algebraMap L M)).coeffs
: Set M) Z.toSubalgebra.toSubring := by
intro c hc
obtain n, hn, rfl := mem_coeffs_iff.mp hc
rw [coeff_map]
have hne : (minpoly L x).coeff n 0 := by
intro h0
rw [mem_support_iff, coeff_map, h0, map_zero] at hn
exact hn rfl
exact subset_adjoin K S
(minpoly L x).coeff n, coeff_mem_coeffs hne, rfl
refine ((minpoly L x).map (algebraMap L M)).toSubring
Z.toSubalgebra.toSubring hco, ?_, ?_
· exact (monic_toSubring _ _ _).mpr
((minpoly.monic hxL).map _)
· rw [show algebraMap Z M
= (Z.toSubalgebra.toSubring).subtype from rfl,
eval₂_eq_eval_map, map_toSubring, eval_map,
aeval_def, minpoly.aeval]
-- „… und Satz 3.5.4 liefert [Z(m):Z] < ∞.“
have hE : FiniteDimensional Z Zx :=
IntermediateField.adjoin.finiteDimensional hxZ
-- „Mit der Gradformel folgt
-- [Z(m):K] = [Z(m):Z]·[Z:K] < ∞.“
have hZM : FiniteDimensional K (Zx.restrictScalars K) :=
FiniteDimensional.trans K Z Zx
-- „Wieder nach Satz 3.6.5 ist die Erweiterung Z(m)/K dann
-- algebraisch.“
have halg :
Algebra.IsAlgebraic K (Zx.restrictScalars K) :=
Algebra.IsAlgebraic.of_finite K _
-- „Insbesondere ist das Element m ∈ Z(m) algebraisch
-- über K.“
have hmem : x Zx.restrictScalars K :=
mem_adjoin_simple_self Z x
exact IntermediateField.isAlgebraic_iff.mp
(Algebra.IsAlgebraic.isAlgebraic
(x, hmem : Zx.restrictScalars K))
```
Zwei Details verdienen einen zweiten Blick. Erstens: `Zx`
ist eine Erweiterung von $`Z`, aber die Aussage $`Z(m)/K` ist
algebraisch braucht $`Z(m)` als Erweiterung von $`K` diesen
stillschweigenden Wechsel des Grundkörpers, den das Skript gar
nicht erwähnt, macht `restrictScalars K` explizit. Zweitens
steckt im Schritt $`f Z[x]` hat $`m` als Nullstelle, also ist
$`m` algebraisch über $`Z` die kleine Rechnung, dass Auswerten
über $`Z` und Auswerten über $`M` dasselbe ergeben
(`eval₂_eq_eval_map` und `map_toSubring`).
+246
View File
@@ -0,0 +1,246 @@
import VersoManual
import Manual.Meta
-- Minimal-Imports statt `import Mathlib`, ermittelt mit
-- `#min_imports`.
import Mathlib.FieldTheory.IntermediateField.Adjoin.Basic
import Mathlib.RingTheory.Henselian
import Mathlib.RingTheory.RegularLocalRing.Defs
import Mathlib.RingTheory.SimpleRing.Principal
open Verso.Genre
open Verso.Genre.Manual.InlineLean
set_option pp.rawOnError true
set_option verso.docstring.allowMissing true
#doc (Manual) "Die Transitivität der Algebraizität" =>
%%%
htmlSplit := .never
tag := "transitivitaet"
file := "transitivitaet"
%%%
Dieses Kapitel übersetzt das Hauptresultat von Kapitel 3 des
Skripts nach Lean: die Transitivität der Algebraizität. Der
Beweis kombiniert die Gradformel mit dem Satz über den Grad
eines Elements; das Mathlib-Wörterbuch des letzten Kapitels
gilt unverändert weiter.
# Korollar 3.7.1
> *Korollar 3.7.1 (Transitivität der Algebraizität).* Es seien
$`L/K` und $`M/L` zwei algebraische Körpererweiterungen. Dann
ist auch $`M/K` algebraisch.
> _Beweis._ Es sei ein Element $`m M` gegeben. Wir wissen,
dass $`m` algebraisch über $`L` ist; es sei
$`f(x) = λ_0 + λ_1 x + + λ_{n-1} x^{n-1} + x^n` das
Minimalpolynom von $`m` über $`L`. Die Koeffizienten $`λ_i`
liegen in $`L`. Betrachte jetzt den Körper
$`Z := K(λ_0, , λ_{n-1})` und die Kette von
Körpererweiterungen $`K Z Z(m) m`. Die Erweiterung
$`L/K` ist algebraisch, also sind die endlich vielen Elemente
$`λ_0, , λ_{n-1}` allesamt algebraisch über $`K`; deshalb ist
$`[Z:K] < `. Weiter liegt das Polynom $`f` in $`Z[x]` und
hat $`m` als Nullstelle. Also ist $`m` auch algebraisch über
$`Z`, und Satz 3.5.4 liefert $`[Z(m):Z] < `. Mit der
Gradformel folgt $`[Z(m):K] = [Z(m):Z]·[Z:K] < `. Also ist
die Erweiterung $`Z(m)/K` algebraisch; insbesondere ist das
Element $`m Z(m)` algebraisch über $`K`.
Genau dieses Argument adjungiere die endlich vielen
Koeffizienten des Minimalpolynoms, schließe auf Endlichkeit und
klettere mit der Gradformel den Turm hinauf steckt in Mathlib
im Lemma `isIntegral_trans`. Unser Beweis übersetzt die
Rahmensätze des Skripts und zitiert für den Kern dieses Lemma;
der letzte Abschnitt des Kapitels führt auch diesen Beweis
Satz für Satz aus:
```lean
theorem transitivitaet (K L M : Type*) [Field K] [Field L]
[Field M] [Algebra K L] [Algebra L M] [Algebra K M]
[IsScalarTower K L M]
[Algebra.IsAlgebraic K L] [Algebra.IsAlgebraic L M] :
Algebra.IsAlgebraic K M := by
constructor
-- „Es sei ein Element m ∈ M gegeben.“
intro m
-- „Wir wissen, dass m algebraisch über L ist“ — über
-- Körpern gleichbedeutend: m ist ganz über L.
have hm : IsIntegral L m :=
(Algebra.IsAlgebraic.isAlgebraic m).isIntegral
-- Ebenso ist die algebraische Erweiterung L/K ganz.
have : Algebra.IsIntegral K L :=
Algebra.IsAlgebraic.isIntegral
-- „Betrachte jetzt den Körper Z := K(λ₀, …, λ_{n-1}) und
-- die Kette K ⊆ Z ⊆ Z(m) ∋ m …“ — der gesamte Rest
-- des Skript-Beweises ist das Lemma isIntegral_trans.
exact (isIntegral_trans m hm).isAlgebraic
```
Das Skript warnt an dieser Stelle:
> *Warnung (Prüfungsfalle).* Der Satz über die Transitivität der
Algebraizität wird in Prüfungen sehr gern gefragt. Beachten
Sie, dass der Beweis ziemlich indirekt ist. In Prüfungen
sehen wir oft, dass Kandidatinnen und Kandidaten für ein
gegebenes $`a M` direkt ein Minimalpolynom konstruieren
wollen. Das hat in der Geschichte der Mathematik noch in
keiner Prüfung funktioniert. Lassen Sie das!
Die Warnung gilt wortgleich in Lean: Auch Mathlib konstruiert
nirgendwo ein Minimalpolynom von $`m` über $`K` der Beweis von
`isIntegral_trans` läuft über die Endlichkeit von Moduln, nicht
über explizite Polynome.
# Bemerkungen
1. Wer in den Beweis von `isIntegral_trans` hineinschaut, findet
die Schritte des Skripts wieder: Dort wird die von den
Koeffizienten des Minimalpolynoms erzeugte Unteralgebra
gebildet (das $`Z` des Skripts), ihre Endlichkeit als Modul
gezeigt, und am Ende die Endlichkeit längs des Turms
komponiert `Module.Finite.trans`, die Gradformel in der
Gestalt endlich über endlich ist endlich.
2. Als fertiges Zitat ist die Transitivität in Mathlib die
Instanz `Algebra.IsAlgebraic.trans K L M` eine Zeile.
# Übungsaufgabe
Das Skript zieht aus der Transitivität eine schöne Folgerung:
> *Satz und Definition (Algebraischer Abschluss in einem
Oberkörper).* Es sei $`L/K` eine Körpererweiterung. Dann
bildet die Menge
$`\overline{K} := \{ a L : a \text{ ist algebraisch über } K \}`
einen Unterkörper von $`L`, genannt der _algebraische
Abschluss von $`K` im Oberkörper $`L`_.
Die einzelnen Abgeschlossenheiten kennt Mathlib als
`IsIntegral.add`, `IsIntegral.neg`, `IsIntegral.mul`,
`IsIntegral.pow` und `IsIntegral.inv`. Die Übung: Kombinieren
Sie sie. Öffnen Sie `AlgebraInLean/Transitivity.lean` und
ersetzen Sie das `sorry` durch einen Beweis.
```lean
theorem algebraisch_quadrat {K L : Type*} [Field K]
[Field L] [Algebra K L] {a : L}
(ha : IsIntegral K a) :
IsIntegral K (a ^ 2 + a) := by
sorry
```
# Der vollständige Beweis
Zum Schluss der Skript-Beweis der Transitivität, ohne das Zitat
von `isIntegral_trans` die Kette $`K Z Z(m) m` wird
wörtlich nachgebaut. Das komplette Skript-Zitat steht oben;
im Beweis stehen die Sätze wie immer als Kommentare. Drei
Übersetzungsentscheidungen vorweg:
* Die Koeffizienten $`λ_i` des Minimalpolynoms liegen in $`L`;
das Skript liest sie stillschweigend als Elemente von $`M`.
In Lean geschieht das explizit über die Einbettung
`algebraMap L M`. Die endliche Menge der Koeffizienten eines
Polynoms heißt `Polynomial.coeffs`.
* $`f` liegt in $`Z[x]` ist in Lean ein echter
Übersetzungsschritt: `Polynomial.toSubring` fasst ein Polynom,
dessen Koeffizienten in einem Teilring liegen, als Polynom
über diesem Teilring auf.
* Das Skript zitiert zweimal Satz 3.6.5 (endlich erzeugt von
algebraischen Elementen endlich algebraisch); in Mathlib
sind das `IntermediateField.finiteDimensional_adjoin` und
`Algebra.IsAlgebraic.of_finite`. Die Gradformel steckt in
`FiniteDimensional.trans`.
```lean
open Polynomial IntermediateField
theorem transitivitaet_vollstaendig (K L M : Type*)
[Field K] [Field L] [Field M] [Algebra K L]
[Algebra L M] [Algebra K M] [IsScalarTower K L M]
[Algebra.IsAlgebraic K L] [Algebra.IsAlgebraic L M] :
Algebra.IsAlgebraic K M := by
constructor
-- „Es sei ein Element m ∈ M gegeben.“
intro x
-- „Wir wissen, dass m algebraisch über L ist; es sei f
-- das Minimalpolynom von m über L.“
have hxL : IsIntegral L x :=
(Algebra.IsAlgebraic.isAlgebraic x).isIntegral
-- „Die Koeffizienten λᵢ liegen in L.“ — wir fassen sie
-- über die Einbettung L → M als Elemente von M auf.
set S : Set M :=
algebraMap L M '' (minpoly L x).coeffs
-- „Betrachte jetzt den Körper Z := K(λ₀, …, λ_{n-1})“
set Z : IntermediateField K M :=
IntermediateField.adjoin K S
-- „Die Erweiterung L/K ist algebraisch, also sind die
-- endlich vielen Elemente λ₀, …, λ_{n-1} allesamt
-- algebraisch über K.“
have hS : s S, IsIntegral K s := by
rintro _ c, _, rfl
exact ((Algebra.IsAlgebraic.isAlgebraic
(R := K) c).isIntegral).map
(IsScalarTower.toAlgHom K L M)
have hSfin : S.Finite :=
Set.Finite.image _ (minpoly L x).coeffs.finite_toSet
have : Finite S := hSfin.to_subtype
-- „Satz 3.6.5 sagt deshalb, dass [Z:K] < ∞ ist.“
have hZfin : FiniteDimensional K Z :=
IntermediateField.finiteDimensional_adjoin hS
-- „Weiter liegt das Polynom f in Z[x] und hat m als
-- Nullstelle. Also ist m auch algebraisch über Z.“
have hxZ : IsIntegral Z x := by
have hco : (((minpoly L x).map (algebraMap L M)).coeffs
: Set M) Z.toSubalgebra.toSubring := by
intro c hc
obtain n, hn, rfl := mem_coeffs_iff.mp hc
rw [coeff_map]
have hne : (minpoly L x).coeff n 0 := by
intro h0
rw [mem_support_iff, coeff_map, h0, map_zero] at hn
exact hn rfl
exact subset_adjoin K S
(minpoly L x).coeff n, coeff_mem_coeffs hne, rfl
refine ((minpoly L x).map (algebraMap L M)).toSubring
Z.toSubalgebra.toSubring hco, ?_, ?_
· exact (monic_toSubring _ _ _).mpr
((minpoly.monic hxL).map _)
· rw [show algebraMap Z M
= (Z.toSubalgebra.toSubring).subtype from rfl,
eval₂_eq_eval_map, map_toSubring, eval_map,
aeval_def, minpoly.aeval]
-- „… und Satz 3.5.4 liefert [Z(m):Z] < ∞.“
have hE : FiniteDimensional Z Zx :=
IntermediateField.adjoin.finiteDimensional hxZ
-- „Mit der Gradformel folgt
-- [Z(m):K] = [Z(m):Z]·[Z:K] < ∞.“
have hZM : FiniteDimensional K (Zx.restrictScalars K) :=
FiniteDimensional.trans K Z Zx
-- „Wieder nach Satz 3.6.5 ist die Erweiterung Z(m)/K dann
-- algebraisch.“
have halg :
Algebra.IsAlgebraic K (Zx.restrictScalars K) :=
Algebra.IsAlgebraic.of_finite K _
-- „Insbesondere ist das Element m ∈ Z(m) algebraisch
-- über K.“
have hmem : x Zx.restrictScalars K :=
mem_adjoin_simple_self Z x
exact IntermediateField.isAlgebraic_iff.mp
(Algebra.IsAlgebraic.isAlgebraic
(x, hmem : Zx.restrictScalars K))
```
Zwei Details verdienen einen zweiten Blick. Erstens: `Zx`
ist eine Erweiterung von $`Z`, aber die Aussage $`Z(m)/K` ist
algebraisch braucht $`Z(m)` als Erweiterung von $`K` diesen
stillschweigenden Wechsel des Grundkörpers, den das Skript gar
nicht erwähnt, macht `restrictScalars K` explizit. Zweitens
steckt im Schritt $`f Z[x]` hat $`m` als Nullstelle, also ist
$`m` algebraisch über $`Z` die kleine Rechnung, dass Auswerten
über $`Z` und Auswerten über $`M` dasselbe ergeben
(`eval₂_eq_eval_map` und `map_toSubring`).