@@ -5,6 +5,7 @@ Authors: Thomas Browning
5
5
-/
6
6
7
7
import Mathlib.FieldTheory.Normal
8
+ import Mathlib.Order.Closure
8
9
9
10
#align_import field_theory.normal from "leanprover-community/mathlib" @"9fb8964792b4237dac6200193a0d533f1b3f7423"
10
11
/-!
@@ -22,16 +23,27 @@ variable (F K L : Type*) [Field F] [Field K] [Field L] [Algebra F K] [Algebra F
22
23
[IsScalarTower F K L]
23
24
24
25
/-- The normal closure of `K` in `L`. -/
25
- noncomputable def normalClosure : IntermediateField K L :=
26
- { (⨆ f : K →ₐ[F] L, f.fieldRange) with
27
- algebraMap_mem' := fun r =>
28
- le_iSup (fun f : K →ₐ[F] L => f.fieldRange) (IsScalarTower.toAlgHom F K L) ⟨r, rfl⟩ }
29
- #align normal_closure normalClosure
26
+ noncomputable def normalClosure : IntermediateField F L :=
27
+ ⨆ f : K →ₐ[F] L, f.fieldRange
28
+
29
+ lemma normalClosure_def : normalClosure F K L = ⨆ f : K →ₐ[F] L, f.fieldRange :=
30
+ rfl
31
+
32
+ variable {F K L}
33
+
34
+ lemma normalClosure_le_iff {K' : IntermediateField F L} :
35
+ normalClosure F K L ≤ K' ↔ ∀ f : K →ₐ[F] L, f.fieldRange ≤ K' :=
36
+ iSup_le_iff
37
+
38
+ lemma AlgHom.fieldRange_le_normalClosure (f : K →ₐ[F] L) : f.fieldRange ≤ normalClosure F K L :=
39
+ le_iSup AlgHom.fieldRange f
40
+
41
+ variable (F K L)
30
42
31
43
namespace normalClosure
32
44
33
45
theorem restrictScalars_eq_iSup_adjoin [h : Normal F L] :
34
- ( normalClosure F K L).restrictScalars F = ⨆ x : K, adjoin F ((minpoly F x).rootSet L) := by
46
+ normalClosure F K L = ⨆ x : K, adjoin F ((minpoly F x).rootSet L) := by
35
47
classical
36
48
have hi : ∀ x : K, IsIntegral F x :=
37
49
fun x ↦ (isIntegral_algebraMap_iff (algebraMap K L).injective).mp (h.isIntegral _)
@@ -71,12 +83,89 @@ instance is_finiteDimensional [FiniteDimensional F K] :
71
83
haveI : ∀ f : K →ₐ[F] L, FiniteDimensional F f.fieldRange := fun f =>
72
84
f.toLinearMap.finiteDimensional_range
73
85
apply IntermediateField.finiteDimensional_iSup_of_finite
74
- #align normal_closure.is_finite_dimensional normalClosure.is_finiteDimensional
75
86
76
- instance isScalarTower : IsScalarTower F (normalClosure F K L) L :=
77
- -- Porting note: the last argument here `(⨆ (f : K →ₐ[F] L), f.fieldRange).toSubalgebra`
78
- -- was just written as `_` in mathlib3.
79
- IsScalarTower.subalgebra' F L L (⨆ (f : K →ₐ[F] L), f.fieldRange).toSubalgebra
80
- #align normal_closure.is_scalar_tower normalClosure.isScalarTower
87
+ noncomputable instance algebra : Algebra K (normalClosure F K L) :=
88
+ IntermediateField.algebra
89
+ { ⨆ f : K →ₐ[F] L, f.fieldRange with
90
+ algebraMap_mem' := fun r => (toAlgHom F K L).fieldRange_le_normalClosure ⟨r, rfl⟩ }
91
+
92
+ instance : IsScalarTower F K (normalClosure F K L) := by
93
+ apply of_algebraMap_eq'
94
+ ext x
95
+ exact algebraMap_apply F K L x
96
+
97
+ instance : IsScalarTower K (normalClosure F K L) L :=
98
+ of_algebraMap_eq' rfl
99
+
100
+ lemma restrictScalars_eq :
101
+ (toAlgHom K (normalClosure F K L) L).fieldRange.restrictScalars F = normalClosure F K L :=
102
+ SetLike.ext' Subtype.range_val
81
103
82
104
end normalClosure
105
+
106
+ namespace IntermediateField
107
+
108
+ variable {F L}
109
+ variable (K K' : IntermediateField F L)
110
+
111
+ lemma le_normalClosure : K ≤ normalClosure F K L :=
112
+ K.fieldRange_val.symm.trans_le K.val.fieldRange_le_normalClosure
113
+
114
+ lemma normalClosure_of_normal [Normal F K] : normalClosure F K L = K :=
115
+ by simp only [normalClosure_def, AlgHom.fieldRange_of_normal, iSup_const]
116
+
117
+ variable [Normal F L]
118
+
119
+ lemma normalClosure_def' : normalClosure F K L = ⨆ f : L →ₐ[F] L, K.map f := by
120
+ refine' (normalClosure_def F K L).trans (le_antisymm (iSup_le (fun f ↦ _)) (iSup_le (fun f ↦ _)))
121
+ · exact le_iSup_of_le (f.liftNormal L) (fun b ⟨a, h⟩ ↦ ⟨a, a.2 , h ▸ f.liftNormal_commutes L a⟩)
122
+ · exact le_iSup_of_le (f.comp K.val) (fun b ⟨a, h⟩ ↦ ⟨⟨a, h.1 ⟩, h.2 ⟩)
123
+
124
+ lemma normalClosure_def'' : normalClosure F K L = ⨆ f : L ≃ₐ[F] L, K.map f := by
125
+ refine' (normalClosure_def' K).trans (le_antisymm (iSup_le (fun f ↦ _)) (iSup_le (fun f ↦ _)))
126
+ · exact le_iSup_of_le (f.restrictNormal' L)
127
+ (fun b ⟨a, h⟩ ↦ ⟨a, h.1 , h.2 ▸ f.restrictNormal_commutes L a⟩)
128
+ · exact le_iSup_of_le f le_rfl
129
+
130
+ lemma normalClosure_mono (h : K ≤ K') : normalClosure F K L ≤ normalClosure F K' L := by
131
+ rw [normalClosure_def', normalClosure_def']
132
+ exact iSup_mono (fun f ↦ map_mono f h)
133
+
134
+ variable (F L)
135
+
136
+ /-- `normalClosure` as a `ClosureOperator`. -/
137
+ @[simps]
138
+ noncomputable def closureOperator : ClosureOperator (IntermediateField F L) where
139
+ toFun := fun K ↦ normalClosure F K L
140
+ monotone' := fun K K' ↦ normalClosure_mono K K'
141
+ le_closure' := le_normalClosure
142
+ idempotent' := fun K ↦ normalClosure_of_normal (normalClosure F K L)
143
+
144
+ variable {K : IntermediateField F L} {F L}
145
+
146
+ lemma normal_iff_normalClosure_eq : Normal F K ↔ normalClosure F K L = K :=
147
+ ⟨@normalClosure_of_normal (K := K), fun h ↦ h ▸ normalClosure.normal F K L⟩
148
+
149
+ lemma normal_iff_normalClosure_le : Normal F K ↔ normalClosure F K L ≤ K :=
150
+ normal_iff_normalClosure_eq.trans (le_normalClosure K).le_iff_eq.symm
151
+
152
+ lemma normal_iff_forall_fieldRange_le : Normal F K ↔ ∀ σ : K →ₐ[F] L, σ.fieldRange ≤ K :=
153
+ by rw [normal_iff_normalClosure_le, normalClosure_def, iSup_le_iff]
154
+
155
+ lemma normal_iff_forall_map_le : Normal F K ↔ ∀ σ : L →ₐ[F] L, K.map σ ≤ K :=
156
+ by rw [normal_iff_normalClosure_le, normalClosure_def', iSup_le_iff]
157
+
158
+ lemma normal_iff_forall_map_le' : Normal F K ↔ ∀ σ : L ≃ₐ[F] L, K.map ↑σ ≤ K :=
159
+ by rw [normal_iff_normalClosure_le, normalClosure_def'', iSup_le_iff]
160
+
161
+ lemma normal_iff_forall_fieldRange_eq : Normal F K ↔ ∀ σ : K →ₐ[F] L, σ.fieldRange = K :=
162
+ ⟨@AlgHom.fieldRange_of_normal (E := K), normal_iff_forall_fieldRange_le.2 ∘ fun h σ ↦ (h σ).le⟩
163
+
164
+ lemma normal_iff_forall_map_eq : Normal F K ↔ ∀ σ : L →ₐ[F] L, K.map σ = K :=
165
+ ⟨fun h σ ↦ (K.fieldRange_val ▸ AlgHom.map_fieldRange K.val σ).trans
166
+ (normal_iff_forall_fieldRange_eq.1 h _), fun h ↦ normal_iff_forall_map_le.2 (fun σ ↦ (h σ).le)⟩
167
+
168
+ lemma normal_iff_forall_map_eq' : Normal F K ↔ ∀ σ : L ≃ₐ[F] L, K.map ↑σ = K :=
169
+ ⟨fun h σ ↦ normal_iff_forall_map_eq.1 h σ, fun h ↦ normal_iff_forall_map_le'.2 (fun σ ↦ (h σ).le)⟩
170
+
171
+ end IntermediateField
0 commit comments