Skip to content

Commit 6079a14

Browse files
tb65536eric-wieser
andcommitted
refactor(FieldTheory/NormalClosure): change definition and add API (#6163)
This PR adds API and changes the definition of the normal closure of $F\leq K\leq L$ to be an intermediate field of L/F, rather than an intermediate field of L/K. For example, I think it would be more common to say that the normal closure of $\mathbb{Q}(\sqrt[3]{2})/\mathbb{Q}$ is $\mathbb{Q}(\sqrt[3]{2},\zeta_3)/\mathbb{Q}$ rather than $\mathbb{Q}(\sqrt[3]{2},\zeta_3)/\mathbb{Q}(\sqrt[3]{2})$. This change also means that the normal closure goes from being a dependent function `(K : Type) → IntermediateField K L` to being a non-dependent function `Type → IntermediateField F L`, making it easier to compare across the Galois corespondence. Supersedes leanprover-community/mathlib3#18971 Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Thomas Browning <tb65536@users.noreply.github.com>
1 parent 2c0daa9 commit 6079a14

File tree

3 files changed

+105
-19
lines changed

3 files changed

+105
-19
lines changed

Mathlib/FieldTheory/IntermediateField.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,10 @@ theorem map_map {K L₁ L₂ L₃ : Type*} [Field K] [Field L₁] [Algebra K L
423423
SetLike.coe_injective <| Set.image_image _ _ _
424424
#align intermediate_field.map_map IntermediateField.map_map
425425

426+
theorem map_mono (f : L →ₐ[K] L') {S T : IntermediateField K L} (h : S ≤ T) :
427+
S.map f ≤ T.map f :=
428+
SetLike.coe_mono (Set.image_subset f h)
429+
426430
/-- Given an equivalence `e : L ≃ₐ[K] L'` of `K`-field extensions and an intermediate
427431
field `E` of `L/K`, `intermediate_field_equiv_map e E` is the induced equivalence
428432
between `E` and `E.map e` -/

Mathlib/FieldTheory/KrullTopology.lean

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,6 @@ all intermediate fields `E` with `E/K` finite dimensional.
5757

5858
open scoped Classical
5959

60-
/-- Mapping intermediate fields along algebra equivalences preserves the partial order -/
61-
theorem IntermediateField.map_mono {K L M : Type*} [Field K] [Field L] [Field M] [Algebra K L]
62-
[Algebra K M] {E1 E2 : IntermediateField K L} (e : L ≃ₐ[K] M) (h12 : E1 ≤ E2) :
63-
E1.map e.toAlgHom ≤ E2.map e.toAlgHom :=
64-
Set.image_subset e h12
65-
#align intermediate_field.map_mono IntermediateField.map_mono
66-
6760
/-- Mapping intermediate fields along the identity does not change them -/
6861
theorem IntermediateField.map_id {K L : Type*} [Field K] [Field L] [Algebra K L]
6962
(E : IntermediateField K L) : E.map (AlgHom.id K L) = E :=

Mathlib/FieldTheory/NormalClosure.lean

Lines changed: 101 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Thomas Browning
55
-/
66

77
import Mathlib.FieldTheory.Normal
8+
import Mathlib.Order.Closure
89

910
#align_import field_theory.normal from "leanprover-community/mathlib"@"9fb8964792b4237dac6200193a0d533f1b3f7423"
1011
/-!
@@ -22,16 +23,27 @@ variable (F K L : Type*) [Field F] [Field K] [Field L] [Algebra F K] [Algebra F
2223
[IsScalarTower F K L]
2324

2425
/-- 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)
3042

3143
namespace normalClosure
3244

3345
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
3547
classical
3648
have hi : ∀ x : K, IsIntegral F x :=
3749
fun x ↦ (isIntegral_algebraMap_iff (algebraMap K L).injective).mp (h.isIntegral _)
@@ -71,12 +83,89 @@ instance is_finiteDimensional [FiniteDimensional F K] :
7183
haveI : ∀ f : K →ₐ[F] L, FiniteDimensional F f.fieldRange := fun f =>
7284
f.toLinearMap.finiteDimensional_range
7385
apply IntermediateField.finiteDimensional_iSup_of_finite
74-
#align normal_closure.is_finite_dimensional normalClosure.is_finiteDimensional
7586

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
81103

82104
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.2fun 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

Comments
 (0)