Update Elements.lean
This commit is contained in:
1 parent
06f12adfa9
commit
d78114a107
1 file changed
+485
-2
+485
-2
@@ -78,7 +78,8 @@ unter Inversenbildung“ — ist in Mathlib die Konstruktion
|
||||
`IntermediateField.adjoin.powerBasis`: Für ganzes $`a` baut sie
|
||||
aus den Potenzen $`1, a, …, a^{m-1}` eine Basis von `K⟮a⟯`, eine
|
||||
sogenannte _Potenzbasis_. Wie bei der Gradformel bleibt für uns
|
||||
das Abzählen der Basis.
|
||||
das Abzählen der Basis — und wie dort holen wir den vollständigen
|
||||
Beweis am Ende des Kapitels nach.
|
||||
|
||||
```lean
|
||||
open IntermediateField
|
||||
@@ -131,7 +132,9 @@ 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:
|
||||
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]
|
||||
@@ -207,3 +210,483 @@ theorem algebraisch_quadrat {K L : Type*} [Field K]
|
||||
IsIntegral K (a ^ 2 + a) := by
|
||||
sorry
|
||||
```
|
||||
|
||||
# Der vollständige Beweis von Satz 3.5.4
|
||||
|
||||
Oben haben wir die eigentliche Arbeit — die Potenzen bilden eine
|
||||
Basis von $`K(a)` — bei `IntermediateField.adjoin.powerBasis`
|
||||
eingekauft. Jetzt führen wir den Skript-Beweis Satz für Satz
|
||||
selbst aus. Er ist deutlich länger als der vollständige Beweis
|
||||
der Gradformel, denn das Skript zeigt hier wirklich etwas
|
||||
Substantielles: dass ein endlichdimensionaler Untervektorraum,
|
||||
der unter Multiplikation abgeschlossen ist, automatisch auch
|
||||
Inverse enthält.
|
||||
|
||||
Die Hauptfigur ist der Untervektorraum aus dem Skript:
|
||||
|
||||
> Betrachte deshalb den $`m`-dimensionalen Untervektorraum
|
||||
$`V := \langle 1, a, a^2, …, a^{m-1} \rangle_K ⊆ K(a)`.
|
||||
|
||||
```lean
|
||||
open Polynomial
|
||||
|
||||
variable {K L : Type*} [Field K] [Field L] [Algebra K L]
|
||||
|
||||
-- Der Untervektorraum V = ⟨1, a, …, a^{m-1}⟩ des Skripts.
|
||||
noncomputable def potenzraum (K : Type*) {L : Type*}
|
||||
[Field K] [Field L] [Algebra K L] (a : L) :
|
||||
Submodule K L :=
|
||||
Submodule.span K (Set.range
|
||||
fun i : Fin (minpoly K a).natDegree => a ^ (i : ℕ))
|
||||
```
|
||||
|
||||
Ein Argument benutzt das Skript zweimal — einmal für $`a`, später
|
||||
noch einmal für ein Element $`y ∈ V`:
|
||||
|
||||
> Falls nicht, dann gäbe es eine Zahl $`m ∈ ℕ` und Elemente
|
||||
$`λ_0, …, λ_m ∈ K`, die nicht alle gleich Null sind, sodass
|
||||
$`0 = \sum_{i} λ_i \cdot a^i` ist. Dann wäre $`a` aber eine
|
||||
Nullstelle des Polynoms $`f(x) = \sum_i λ_i \cdot x^i ∈ K[x]`,
|
||||
welches nicht das Nullpolynom ist.
|
||||
|
||||
Wir formulieren es deshalb als eigenes Hilfslemma: Eine
|
||||
nichttriviale lineare Relation unter den Potenzen liefert ein
|
||||
Polynom.
|
||||
|
||||
```lean
|
||||
theorem polynom_aus_relation {k : ℕ} (y : L) (μ : Fin k → K)
|
||||
(hrel : ∑ i, μ i • y ^ (i : ℕ) = 0) (i₀ : Fin k)
|
||||
(hμ : μ i₀ ≠ 0) :
|
||||
∃ g : K[X],
|
||||
g ≠ 0 ∧ g.degree < (k : ℕ) ∧ aeval y g = 0 := by
|
||||
-- Das Polynom g = ∑ μᵢ·xⁱ …
|
||||
refine ⟨∑ i : Fin k, C (μ i) * X ^ (i : ℕ), ?_, ?_, ?_⟩
|
||||
-- „… welches nicht das Nullpolynom ist“: sein i₀-ter
|
||||
-- Koeffizient ist μᵢ₀ ≠ 0.
|
||||
· intro h0
|
||||
apply hμ
|
||||
have hc := congrArg (fun g => coeff g (i₀ : ℕ)) h0
|
||||
simpa [finsetSum_coeff, coeff_C_mul, coeff_X_pow,
|
||||
Fin.val_inj] using hc
|
||||
-- … hat Grad < k …
|
||||
· refine lt_of_le_of_lt (degree_sum_le _ _) ?_
|
||||
rw [Finset.sup_lt_iff
|
||||
(by exact_mod_cast WithBot.bot_lt_coe k)]
|
||||
intro i _
|
||||
exact lt_of_le_of_lt (degree_C_mul_X_pow_le _ _)
|
||||
(by exact_mod_cast i.isLt)
|
||||
-- … und „y wäre eine Nullstelle des Polynoms“.
|
||||
· rw [map_sum]
|
||||
simp_rw [map_mul, aeval_C, map_pow, aeval_X,
|
||||
← Algebra.smul_def]
|
||||
exact hrel
|
||||
```
|
||||
|
||||
Damit folgt die lineare Unabhängigkeit wie im Skript:
|
||||
|
||||
> Die Menge $`\{1, a, a^2, …, a^{m-1}\} ⊆ K(a)` ist linear
|
||||
unabhängig über $`K`: Jede nicht-triviale Linearkombination
|
||||
der Null lieferte nämlich ein Polynom vom Grad kleiner $`m`,
|
||||
welches nicht das Nullpolynom ist und $`a` als Nullstelle
|
||||
hat — im Widerspruch zur Minimalität des Grades des
|
||||
Minimalpolynoms.
|
||||
|
||||
Die „Minimalität des Grades“ heißt in Mathlib
|
||||
`minpoly.degree_le_of_ne_zero`.
|
||||
|
||||
```lean
|
||||
theorem potenzen_unabhaengig {a : L} (ha : IsIntegral K a) :
|
||||
LinearIndependent K
|
||||
(fun i : Fin (minpoly K a).natDegree =>
|
||||
a ^ (i : ℕ)) := by
|
||||
rw [Fintype.linearIndependent_iff]
|
||||
intro μ hrel i₀
|
||||
by_contra hμ
|
||||
-- „Jede nicht-triviale Linearkombination der Null
|
||||
-- lieferte ein Polynom vom Grad kleiner m … mit a als
|
||||
-- Nullstelle“
|
||||
obtain ⟨g, hg0, hdeg, hroot⟩ :=
|
||||
polynom_aus_relation a μ hrel i₀ hμ
|
||||
-- „im Widerspruch zur Minimalität des Grades des
|
||||
-- Minimalpolynoms.“
|
||||
have hle := minpoly.degree_le_of_ne_zero K a hg0 hroot
|
||||
rw [degree_eq_natDegree (minpoly.ne_zero ha)] at hle
|
||||
exact absurd (hle.trans_lt hdeg) (lt_irrefl _)
|
||||
```
|
||||
|
||||
Nun der erste Schritt des Skripts:
|
||||
|
||||
> _Schritt 1: Abgeschlossenheit unter Multiplikation._ Weil
|
||||
$`a` eine Nullstelle des Minimalpolynoms $`f` ist, gilt die
|
||||
Gleichung $`a^m = -\sum_{i=0}^{m-1} λ_i \cdot a^i ∈ V`.
|
||||
Durch wiederholte Anwendung dieser Gleichung folgt induktiv,
|
||||
dass $`a^n ∈ V` ist, für alle Zahlen $`n ∈ ℕ`. Jedes Produkt
|
||||
von Elementen aus $`V` ist eine $`K`-Linearkombination von
|
||||
Potenzen von $`a`, also gilt für alle $`v_1, v_2 ∈ V`, dass
|
||||
$`v_1 \cdot v_2 ∈ V` ist.
|
||||
|
||||
```lean
|
||||
-- „Weil a eine Nullstelle des Minimalpolynoms f ist, gilt
|
||||
-- die Gleichung a^m = -∑ λᵢ·aⁱ.“
|
||||
theorem hoechste_potenz {a : L} (ha : IsIntegral K a) :
|
||||
a ^ (minpoly K a).natDegree =
|
||||
-∑ i ∈ Finset.range (minpoly K a).natDegree,
|
||||
(minpoly K a).coeff i • a ^ i := by
|
||||
have h := minpoly.aeval K a
|
||||
rw [aeval_eq_sum_range, Finset.sum_range_succ,
|
||||
(minpoly.monic ha).coeff_natDegree, one_smul] at h
|
||||
exact eq_neg_of_add_eq_zero_right h
|
||||
|
||||
-- „Durch wiederholte Anwendung dieser Gleichung folgt
|
||||
-- induktiv, dass aⁿ ∈ V ist, für alle Zahlen n ∈ ℕ.“
|
||||
theorem potenz_mem {a : L} (ha : IsIntegral K a) (n : ℕ) :
|
||||
a ^ n ∈ potenzraum K a := by
|
||||
induction n using Nat.strong_induction_on with
|
||||
| _ n IH =>
|
||||
by_cases hn : n < (minpoly K a).natDegree
|
||||
· exact Submodule.subset_span ⟨⟨n, hn⟩, rfl⟩
|
||||
· rw [not_lt] at hn
|
||||
have hm0 : 0 < (minpoly K a).natDegree :=
|
||||
minpoly.natDegree_pos ha
|
||||
have hsplit : a ^ n =
|
||||
a ^ (n - (minpoly K a).natDegree)
|
||||
* a ^ (minpoly K a).natDegree := by
|
||||
rw [← pow_add]
|
||||
congr 1
|
||||
omega
|
||||
rw [hsplit, hoechste_potenz ha, mul_neg,
|
||||
Finset.mul_sum]
|
||||
refine Submodule.neg_mem _
|
||||
(Submodule.sum_mem _ fun i hi => ?_)
|
||||
rw [mul_smul_comm, ← pow_add]
|
||||
refine Submodule.smul_mem _ _ (IH _ ?_)
|
||||
have := Finset.mem_range.mp hi
|
||||
omega
|
||||
|
||||
-- „Jedes Produkt von Elementen aus V ist eine
|
||||
-- K-Linearkombination von Potenzen von a, also gilt für
|
||||
-- alle v₁, v₂ ∈ V, dass v₁·v₂ ∈ V ist.“
|
||||
theorem produkt_mem {a : L} (ha : IsIntegral K a) {x y : L}
|
||||
(hx : x ∈ potenzraum K a) (hy : y ∈ potenzraum K a) :
|
||||
x * y ∈ potenzraum K a := by
|
||||
induction hx, hy using Submodule.span_induction₂ with
|
||||
| mem_mem u v hu hv =>
|
||||
obtain ⟨i, rfl⟩ := hu
|
||||
obtain ⟨j, rfl⟩ := hv
|
||||
simpa [pow_add] using potenz_mem ha ((i : ℕ) + (j : ℕ))
|
||||
| zero_left v hv => simp
|
||||
| zero_right u hu => simp
|
||||
| add_left u v w _ _ hw h1 h2 =>
|
||||
rw [add_mul]
|
||||
exact Submodule.add_mem _ h1 h2
|
||||
| add_right u v w hu _ _ h1 h2 =>
|
||||
rw [mul_add]
|
||||
exact Submodule.add_mem _ h1 h2
|
||||
| smul_left r u v _ _ h =>
|
||||
rw [smul_mul_assoc]
|
||||
exact Submodule.smul_mem _ _ h
|
||||
| smul_right r u v _ _ h =>
|
||||
rw [mul_smul_comm]
|
||||
exact Submodule.smul_mem _ _ h
|
||||
```
|
||||
|
||||
Das „Jedes Produkt … ist eine $`K`-Linearkombination“ erledigt
|
||||
`Submodule.span_induction₂`: Es genügt, die Behauptung für die
|
||||
erzeugenden Potenzen zu prüfen (der Fall `mem_mem`, dort ist
|
||||
$`a^i \cdot a^j = a^{i+j}`); Summen und Vielfache vererben sich.
|
||||
|
||||
Der zweite Schritt ist das Herzstück:
|
||||
|
||||
> _Schritt 2: Abgeschlossenheit unter Inversenbildung._ Es sei
|
||||
$`y ∈ V` mit $`y ≠ 0` gegeben. Weil $`V` abgeschlossen unter
|
||||
der Multiplikation ist, liegen alle Potenzen
|
||||
$`1, y, y^2, …, y^m` in $`V`. Das sind $`m+1` Elemente in
|
||||
einem Vektorraum der Dimension $`m`, also sind diese Elemente
|
||||
linear abhängig über $`K`. Insbesondere ist $`y` algebraisch
|
||||
über $`K`. Es sei $`g(x) = c_0 + c_1 x + ⋯ + x^n` das
|
||||
Minimalpolynom von $`y` über $`K`. Dann ist $`c_0 ≠ 0`:
|
||||
Andernfalls könnte ich nämlich in $`g` einmal $`x`
|
||||
ausklammern, also $`g = x \cdot h` schreiben. Weil $`K(a)`
|
||||
ein Körper und $`y ≠ 0` ist, folgte aus
|
||||
$`0 = g(y) = y \cdot h(y)` schon $`h(y) = 0` — im Widerspruch
|
||||
zur Minimalität des Grades von $`g`. Aus der Gleichung
|
||||
$`0 = g(y) = y \cdot (y^{n-1} + c_{n-1} y^{n-2} + ⋯ + c_1) + c_0`
|
||||
folgt jetzt $`1/y = (y^{n-1} + ⋯ + c_1)/(-c_0) ∈ V`, denn der
|
||||
Zähler ist eine $`K`-Linearkombination von Potenzen von $`y`,
|
||||
liegt also in $`V`, und der Nenner $`-c_0` liegt in $`K`.
|
||||
|
||||
Das Zählargument „$`m+1` Elemente in Dimension $`m`“ ist
|
||||
`LinearIndependent.fintype_card_le_finrank`; die Dimension von
|
||||
$`V` kennen wir aus der linearen Unabhängigkeit
|
||||
(`finrank_span_eq_card`).
|
||||
|
||||
```lean
|
||||
theorem invers_mem {a : L} (ha : IsIntegral K a) {y : L}
|
||||
(hy : y ∈ potenzraum K a) (hy0 : y ≠ 0) :
|
||||
y⁻¹ ∈ potenzraum K a := by
|
||||
-- „Weil V abgeschlossen unter der Multiplikation ist,
|
||||
-- liegen alle Potenzen 1, y, y², … in V.“
|
||||
have hyn : ∀ j : ℕ, y ^ j ∈ potenzraum K a := by
|
||||
intro j
|
||||
induction j with
|
||||
| zero => simpa using potenz_mem ha 0
|
||||
| succ j IH =>
|
||||
rw [pow_succ]
|
||||
exact produkt_mem ha IH hy
|
||||
-- „Das sind m+1 Elemente in einem Vektorraum der
|
||||
-- Dimension m, also sind diese Elemente linear abhängig
|
||||
-- über K.“
|
||||
have hfin : FiniteDimensional K (potenzraum K a) := by
|
||||
unfold potenzraum
|
||||
exact FiniteDimensional.span_of_finite K
|
||||
(Set.finite_range _)
|
||||
have hdim : Module.finrank K (potenzraum K a)
|
||||
= (minpoly K a).natDegree := by
|
||||
unfold potenzraum
|
||||
rw [finrank_span_eq_card (potenzen_unabhaengig ha),
|
||||
Fintype.card_fin]
|
||||
have habh : ¬ LinearIndependent K
|
||||
(fun i : Fin ((minpoly K a).natDegree + 1) =>
|
||||
(⟨y ^ (i : ℕ), hyn i⟩ : potenzraum K a)) := by
|
||||
intro h
|
||||
have hcard := h.fintype_card_le_finrank
|
||||
rw [Fintype.card_fin, hdim] at hcard
|
||||
omega
|
||||
-- „Insbesondere ist y algebraisch über K.“
|
||||
rw [Fintype.not_linearIndependent_iff] at habh
|
||||
obtain ⟨μ, hrel, i₀, hμ0⟩ := habh
|
||||
have hrelL : ∑ i : Fin ((minpoly K a).natDegree + 1),
|
||||
μ i • y ^ (i : ℕ) = 0 := by
|
||||
simpa using congrArg
|
||||
(Submodule.subtype (potenzraum K a)) hrel
|
||||
obtain ⟨g, hg0, _, hgroot⟩ :=
|
||||
polynom_aus_relation y μ hrelL i₀ hμ0
|
||||
have hyint : IsIntegral K y :=
|
||||
(IsAlgebraic.isIntegral ⟨g, hg0, hgroot⟩)
|
||||
-- „Es sei g das Minimalpolynom von y über K. Dann ist
|
||||
-- c₀ ≠ 0: Andernfalls könnte ich nämlich in g einmal x
|
||||
-- ausklammern, also g = x·h schreiben. Weil K(a) ein
|
||||
-- Körper und y ≠ 0 ist, folgte aus 0 = g(y) = y·h(y)
|
||||
-- schon h(y) = 0 — im Widerspruch zur Minimalität des
|
||||
-- Grades von g.“
|
||||
have hc0 : (minpoly K y).coeff 0 ≠ 0 := by
|
||||
intro h0
|
||||
obtain ⟨h, hh⟩ := X_dvd_iff.mpr h0
|
||||
have hhy : aeval y h = 0 := by
|
||||
have haev := minpoly.aeval K y
|
||||
rw [hh, map_mul, aeval_X] at haev
|
||||
rcases mul_eq_zero.mp haev with h1 | h1
|
||||
· exact absurd h1 hy0
|
||||
· exact h1
|
||||
have hhne : h ≠ 0 := by
|
||||
rintro rfl
|
||||
rw [mul_zero] at hh
|
||||
exact minpoly.ne_zero hyint hh
|
||||
have hle := minpoly.degree_le_of_ne_zero K y hhne hhy
|
||||
rw [hh, mul_comm] at hle
|
||||
exact absurd hle
|
||||
(not_le.mpr (degree_lt_degree_mul_X hhne))
|
||||
-- „Aus der Gleichung 0 = g(y) = y·(y^{n-1} + ⋯ + c₁) + c₀
|
||||
-- folgt jetzt 1/y = (y^{n-1} + ⋯ + c₁)/(-c₀) ∈ V …“
|
||||
have expand := minpoly.aeval K y
|
||||
rw [aeval_eq_sum_range, Finset.sum_range_succ'] at expand
|
||||
simp_rw [pow_succ, ← smul_mul_assoc, pow_zero] at expand
|
||||
rw [← Finset.sum_mul] at expand
|
||||
have hwy : (∑ i ∈ Finset.range (minpoly K y).natDegree,
|
||||
(minpoly K y).coeff (i + 1) • y ^ i) * y
|
||||
= -((minpoly K y).coeff 0 • 1) :=
|
||||
eq_neg_of_add_eq_zero_left expand
|
||||
have hone : y * ((-(minpoly K y).coeff 0)⁻¹ •
|
||||
∑ i ∈ Finset.range (minpoly K y).natDegree,
|
||||
(minpoly K y).coeff (i + 1) • y ^ i) = 1 := by
|
||||
rw [mul_smul_comm, mul_comm y, hwy, ← neg_smul,
|
||||
smul_smul, inv_mul_cancel₀ (neg_ne_zero.mpr hc0),
|
||||
one_smul]
|
||||
rw [inv_eq_of_mul_eq_one_right hone]
|
||||
-- „… denn der Zähler ist eine K-Linearkombination von
|
||||
-- Potenzen von y, liegt also in V, und der Nenner -c₀
|
||||
-- liegt in K.“
|
||||
exact Submodule.smul_mem _ _
|
||||
(Submodule.sum_mem _ fun i _ =>
|
||||
Submodule.smul_mem _ _ (hyn i))
|
||||
```
|
||||
|
||||
Bleibt der Zusammenbau:
|
||||
|
||||
> Ich behaupte, dass $`V = K(a)` ist; damit ist dann
|
||||
$`[K(a):K] = \dim_K V = m` und der Satz ist bewiesen. Um die
|
||||
Behauptung zu zeigen, genügt es zu zeigen, dass $`V` ein
|
||||
Unterkörper von $`K(a)` ist. Denn $`V` enthält $`K` und das
|
||||
Element $`a`, und $`K(a)` ist per Definition der kleinste
|
||||
Unterkörper, der $`K` und $`a` enthält. Weil $`V` ein
|
||||
Untervektorraum ist, ist $`V` abgeschlossen unter der
|
||||
Addition.
|
||||
|
||||
Das „Bündeln“ von $`V` mit den bewiesenen Abgeschlossenheiten zu
|
||||
einem Unterkörper ist in Lean das Ausfüllen der Strukturfelder
|
||||
von `Subalgebra` und `IntermediateField`; das „per Definition
|
||||
der kleinste Unterkörper“ ist `adjoin_simple_le_iff`.
|
||||
|
||||
```lean
|
||||
theorem grad_element_vollstaendig {a : L}
|
||||
(ha : IsIntegral K a) :
|
||||
Module.finrank K K⟮a⟯ = (minpoly K a).natDegree := by
|
||||
-- „… genügt es zu zeigen, dass V ein Unterkörper von K(a)
|
||||
-- ist.“ — wir bündeln V zu einem Zwischenkörper F:
|
||||
let A : Subalgebra K L :=
|
||||
{ carrier := potenzraum K a
|
||||
mul_mem' := fun hx hy => produkt_mem ha hx hy
|
||||
one_mem' := by simpa using potenz_mem ha 0
|
||||
add_mem' := fun hx hy => Submodule.add_mem _ hx hy
|
||||
zero_mem' := Submodule.zero_mem _
|
||||
algebraMap_mem' := fun c => by
|
||||
rw [Algebra.algebraMap_eq_smul_one]
|
||||
exact Submodule.smul_mem _ _
|
||||
(by simpa using potenz_mem ha 0) }
|
||||
let F : IntermediateField K L :=
|
||||
{ A with
|
||||
inv_mem' := fun x hx => by
|
||||
by_cases hx0 : x = 0
|
||||
· rw [hx0, inv_zero]
|
||||
exact Submodule.zero_mem _
|
||||
· exact invers_mem ha hx hx0 }
|
||||
-- „Denn V enthält K und das Element a, und K(a) ist per
|
||||
-- Definition der kleinste Unterkörper, der K und a
|
||||
-- enthält.“
|
||||
have haF : a ∈ F := by
|
||||
show a ∈ potenzraum K a
|
||||
simpa using potenz_mem ha 1
|
||||
have oben : K⟮a⟯ ≤ F := adjoin_simple_le_iff.mpr haF
|
||||
have unten : F ≤ K⟮a⟯ := by
|
||||
intro x hx
|
||||
have hVsub : potenzraum K a ≤
|
||||
Subalgebra.toSubmodule K⟮a⟯.toSubalgebra := by
|
||||
unfold potenzraum
|
||||
rw [Submodule.span_le]
|
||||
rintro _ ⟨i, rfl⟩
|
||||
exact pow_mem (mem_adjoin_simple_self K a) _
|
||||
exact hVsub hx
|
||||
have hFK : F = K⟮a⟯ := le_antisymm unten oben
|
||||
-- „… damit ist dann [K(a):K] = dim_K V = m und der Satz
|
||||
-- ist bewiesen.“
|
||||
rw [← hFK]
|
||||
have h1 : Module.finrank K F
|
||||
= Module.finrank K (potenzraum K a) :=
|
||||
(Subalgebra.finrank_toSubmodule A).symm
|
||||
rw [h1]
|
||||
unfold potenzraum
|
||||
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 Z⟮x⟯ :=
|
||||
IntermediateField.adjoin.finiteDimensional hxZ
|
||||
-- „Mit der Gradformel folgt
|
||||
-- [Z(m):K] = [Z(m):Z]·[Z:K] < ∞.“
|
||||
have hZM : FiniteDimensional K (Z⟮x⟯.restrictScalars K) :=
|
||||
FiniteDimensional.trans K Z Z⟮x⟯
|
||||
-- „Wieder nach Satz 3.6.5 ist die Erweiterung Z(m)/K dann
|
||||
-- algebraisch.“
|
||||
have halg :
|
||||
Algebra.IsAlgebraic K (Z⟮x⟯.restrictScalars K) :=
|
||||
Algebra.IsAlgebraic.of_finite K _
|
||||
-- „Insbesondere ist das Element m ∈ Z(m) algebraisch
|
||||
-- über K.“
|
||||
have hmem : x ∈ Z⟮x⟯.restrictScalars K :=
|
||||
mem_adjoin_simple_self Z x
|
||||
exact IntermediateField.isAlgebraic_iff.mp
|
||||
(Algebra.IsAlgebraic.isAlgebraic
|
||||
(⟨x, hmem⟩ : Z⟮x⟯.restrictScalars K))
|
||||
```
|
||||
|
||||
Zwei Details verdienen einen zweiten Blick. Erstens: `Z⟮x⟯`
|
||||
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`).
|
||||
Reference in new issue
Block a user