Skip to content
Closed
Show file tree
Hide file tree
Changes from 29 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
df1109d
refactor and add some easy lemmas about Galois theory
yhtq Mar 10, 2025
c009390
fix style
yhtq Mar 10, 2025
f2dd068
fix
yhtq Mar 10, 2025
3f5a45f
update
yhtq Mar 11, 2025
eed61d8
update
yhtq Mar 11, 2025
e8490e6
update
yhtq Mar 11, 2025
c866026
fix
yhtq Mar 11, 2025
1106175
update
yhtq Mar 11, 2025
8811edb
Update Mathlib/FieldTheory/Galois/Basic.lean
yhtq Mar 12, 2025
0bd1fbb
Update Mathlib/FieldTheory/Galois/Basic.lean
yhtq Mar 12, 2025
ac27fd8
Update Mathlib/FieldTheory/Galois/Basic.lean
yhtq Mar 12, 2025
8e41976
Revert "Update Mathlib/FieldTheory/Galois/Basic.lean"
yhtq Mar 12, 2025
2f3e6ac
Reapply "Update Mathlib/FieldTheory/Galois/Basic.lean"
yhtq Mar 12, 2025
226f165
remove duplicated lemmma in KrullToplogy.lean
yhtq Mar 12, 2025
2dd3867
update
yhtq Mar 12, 2025
2bfcdd6
update
yhtq Mar 12, 2025
db24c97
fix deprecated message
yhtq Mar 12, 2025
324a7e0
change to alias
yhtq Mar 12, 2025
8727db4
clean KrullTopology.lean
mbkybky Mar 16, 2025
f7adb34
Update SeparableDegree.lean
mbkybky Mar 16, 2025
03a708f
Update AbelRuffini.lean
mbkybky Mar 16, 2025
582e30e
Update KrullTopology.lean
mbkybky Mar 16, 2025
e5526de
more
mbkybky Mar 16, 2025
49c3c0f
Merge remote-tracking branch 'origin/GuoZiXun/minpoly' into mbkybky/c…
mbkybky Mar 17, 2025
8dbac9f
Update Mathlib/FieldTheory/Galois/Basic.lean
mbkybky Mar 19, 2025
516010b
Update Mathlib/FieldTheory/IntermediateField/Basic.lean
mbkybky Mar 19, 2025
2cd8d68
use the existing variables line
mbkybky Mar 19, 2025
bf7ccee
rename and generalize
mbkybky Mar 19, 2025
e6c4fc2
add periods
mbkybky Mar 19, 2025
420b06d
Merge branch 'master' into mbkybky/clean_KrullTopology
mbkybky Apr 30, 2025
a5414ab
rename
mbkybky Apr 30, 2025
84f6e4e
fix
mbkybky Apr 30, 2025
395be35
Update Mathlib/FieldTheory/KrullTopology.lean
mbkybky Apr 30, 2025
d93bede
add deprecated aliases
mbkybky May 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion Mathlib/FieldTheory/AbelRuffini.lean
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ that is solvable by radicals has a solvable Galois group.

noncomputable section

open Polynomial IntermediateField
open Polynomial

section AbelRuffini

Expand Down Expand Up @@ -295,6 +295,8 @@ theorem induction3 {α : solvableByRad F E} {n : ℕ} (hn : n ≠ 0) (hα : P (
rw [sub_comp, X_comp, C_comp]
exact gal_X_pow_sub_C_isSolvable n q

open IntermediateField

/-- An auxiliary induction lemma, which is generalized by `solvableByRad.isSolvable`. -/
theorem induction2 {α β γ : solvableByRad F E} (hγ : γ ∈ F⟮α, β⟯) (hα : P α) (hβ : P β) : P γ := by
let p := minpoly F α
Expand Down
64 changes: 51 additions & 13 deletions Mathlib/FieldTheory/Galois/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -180,32 +180,57 @@ def FixedPoints.intermediateField (M : Type*) [Monoid M] [MulSemiringAction M E]

namespace IntermediateField

/-- The intermediate field fixed by a subgroup -/
/-- The intermediate field fixed by a subgroup. -/
def fixedField : IntermediateField F E :=
FixedPoints.intermediateField H

theorem mem_fixedField_iff (x) :
@[simp] lemma mem_fixedField_iff (x) :
x ∈ fixedField H ↔ ∀ f ∈ H, f x = x := by
show x ∈ MulAction.fixedPoints H E ↔ _
simp only [MulAction.mem_fixedPoints, Subtype.forall, Subgroup.mk_smul, AlgEquiv.smul_def]

@[simp] lemma fixedField_bot : fixedField (⊥ : Subgroup (E ≃ₐ[F] E)) = ⊤ := by
ext
simp

theorem finrank_fixedField_eq_card [FiniteDimensional F E] [DecidablePred (· ∈ H)] :
finrank (fixedField H) E = Fintype.card H :=
FixedPoints.finrank_eq_card H E

/-- The subgroup fixing an intermediate field -/
/-- The subgroup fixing an intermediate field. -/
nonrec def fixingSubgroup : Subgroup (E ≃ₐ[F] E) :=
fixingSubgroup (E ≃ₐ[F] E) (K : Set E)

theorem le_iff_le : K ≤ fixedField H ↔ H ≤ fixingSubgroup K :=
⟨fun h g hg x => h (Subtype.mem x) ⟨g, hg⟩, fun h x hx g => h (Subtype.mem g) ⟨x, hx⟩⟩

lemma fixingSubgroup_anti : Antitone (IntermediateField.fixingSubgroup (F := F) (E := E)) := by
intro K K' h
rw [← le_iff_le]
exact le_trans h ((le_iff_le _ _).mpr (le_refl K'.fixingSubgroup))
/-- The map `K ↦ Gal(E/K)` is inclusion-reversing. -/
theorem fixingSubgroup.antimono {K1 K2 : IntermediateField F E} (h12 : K1 ≤ K2) :
K2.fixingSubgroup ≤ K1.fixingSubgroup :=
fun _ hσ ⟨x, hx⟩ ↦ hσ ⟨x, h12 hx⟩

theorem fixedField.antimono {H1 H2 : Subgroup (E ≃ₐ[F] E)} (h12 : H1 ≤ H2) :
fixedField H2 ≤ fixedField H1 :=
fun _ hσ ⟨x, hx⟩ ↦ hσ ⟨x, h12 hx⟩

lemma fixingSubgroup_anti : Antitone (@fixingSubgroup F _ E _ _) :=
fun _ _ ↦ fixingSubgroup.antimono

lemma fixedField_anti : Antitone (@fixedField F _ E _ _) :=
fun _ _ ↦ fixedField.antimono

@[simp] lemma mem_fixingSubgroup_iff (σ) : σ ∈ fixingSubgroup K ↔ ∀ x ∈ K, σ x = x :=
_root_.mem_fixingSubgroup_iff _

/-- The fixing subgroup of `K : IntermediateField F E` is isomorphic to `E ≃ₐ[K] E` -/
@[simp] lemma fixingSubgroup_top : fixingSubgroup (⊤ : IntermediateField F E) = ⊥ := by
ext
simp [DFunLike.ext_iff]

@[simp] lemma fixingSubgroup_bot : fixingSubgroup (⊥ : IntermediateField F E) = ⊤ := by
ext
simp [mem_bot]

/-- The fixing subgroup of `K : IntermediateField F E` is isomorphic to `E ≃ₐ[K] E`. -/
def fixingSubgroupEquiv : fixingSubgroup K ≃* E ≃ₐ[K] E where
toFun ϕ := { AlgEquiv.toRingEquiv (ϕ : E ≃ₐ[F] E) with commutes' := ϕ.mem }
invFun ϕ := ⟨ϕ.restrictScalars _, ϕ.commutes⟩
Expand Down Expand Up @@ -258,6 +283,19 @@ theorem fixedField_fixingSubgroup [FiniteDimensional F E] [h : IsGalois F E] :
Fintype.card_congr (IntermediateField.fixingSubgroupEquiv K).toEquiv]
exact (card_aut_eq_finrank K E).symm

@[simp] lemma fixedField_top [IsGalois F E] [FiniteDimensional F E] :
fixedField (⊤ : Subgroup (E ≃ₐ[F] E)) = ⊥ := by
rw [← fixingSubgroup_bot, fixedField_fixingSubgroup]

theorem mem_bot_iff_fixed [IsGalois F E] [FiniteDimensional F E] (x : E) :
x ∈ (⊥ : IntermediateField F E) ↔ ∀ f : E ≃ₐ[F] E, f x = x := by
rw [← fixedField_top, mem_fixedField_iff]
simp only [Subgroup.mem_top, forall_const]

theorem mem_range_algebraMap_iff_fixed [IsGalois F E] [FiniteDimensional F E] (x : E) :
x ∈ Set.range (algebraMap F E) ↔ ∀ f : E ≃ₐ[F] E, f x = x :=
mem_bot_iff_fixed x

theorem card_fixingSubgroup_eq_finrank [DecidablePred (· ∈ IntermediateField.fixingSubgroup K)]
[FiniteDimensional F E] [IsGalois F E] :
Fintype.card (IntermediateField.fixingSubgroup K) = finrank K E := by
Expand All @@ -275,7 +313,7 @@ def intermediateFieldEquivSubgroup [FiniteDimensional F E] [IsGalois F E] :
rw [← fixedField_fixingSubgroup L, IntermediateField.le_iff_le, fixedField_fixingSubgroup L]
rfl

/-- The Galois correspondence as a `GaloisInsertion` -/
/-- The Galois correspondence as a `GaloisInsertion`. -/
def galoisInsertionIntermediateFieldSubgroup [FiniteDimensional F E] :
GaloisInsertion (OrderDual.toDual ∘
(IntermediateField.fixingSubgroup : IntermediateField F E → Subgroup (E ≃ₐ[F] E)))
Expand All @@ -286,7 +324,7 @@ def galoisInsertionIntermediateFieldSubgroup [FiniteDimensional F E] :
le_l_u H := le_of_eq (IntermediateField.fixingSubgroup_fixedField H).symm
choice_eq _ _ := rfl

/-- The Galois correspondence as a `GaloisCoinsertion` -/
/-- The Galois correspondence as a `GaloisCoinsertion`. -/
def galoisCoinsertionIntermediateFieldSubgroup [FiniteDimensional F E] [IsGalois F E] :
GaloisCoinsertion (OrderDual.toDual ∘
(IntermediateField.fixingSubgroup : IntermediateField F E → Subgroup (E ≃ₐ[F] E)))
Expand All @@ -309,8 +347,8 @@ open scoped Pointwise

lemma IntermediateField.restrictNormalHom_ker (E : IntermediateField K L) [Normal K E] :
(restrictNormalHom E).ker = E.fixingSubgroup := by
simp [fixingSubgroup, Subgroup.ext_iff, AlgEquiv.ext_iff, Subtype.ext_iff,
restrictNormalHom_apply, mem_fixingSubgroup_iff]
simp only [Subgroup.ext_iff, MonoidHom.mem_ker, AlgEquiv.ext_iff, one_apply, Subtype.ext_iff,
restrictNormalHom_apply, Subtype.forall, mem_fixingSubgroup_iff, implies_true]

namespace IsGalois

Expand Down Expand Up @@ -472,7 +510,7 @@ theorem of_separable_splitting_field [sp : p.IsSplittingField F E] (hp : p.Separ
refine LinearEquiv.finrank_eq ?_
rfl

/-- Equivalent characterizations of a Galois extension of finite degree -/
/-- Equivalent characterizations of a Galois extension of finite degree. -/
theorem tfae [FiniteDimensional F E] : List.TFAE [
IsGalois F E,
IntermediateField.fixedField (⊤ : Subgroup (E ≃ₐ[F] E)) = ⊥,
Expand Down
37 changes: 0 additions & 37 deletions Mathlib/FieldTheory/IntermediateField/Adjoin/Defs.lean
Original file line number Diff line number Diff line change
Expand Up @@ -182,25 +182,6 @@ theorem iSup_toSubfield {ι : Sort*} [Nonempty ι] (S : ι → IntermediateField
(iSup S).toSubfield = ⨆ i, (S i).toSubfield := by
simp only [iSup, Set.range_nonempty, sSup_toSubfield, ← Set.range_comp, Function.comp_def]

/-- Construct an algebra isomorphism from an equality of intermediate fields -/
@[simps! apply]
def equivOfEq {S T : IntermediateField F E} (h : S = T) : S ≃ₐ[F] T :=
Subalgebra.equivOfEq _ _ (congr_arg toSubalgebra h)

@[simp]
theorem equivOfEq_symm {S T : IntermediateField F E} (h : S = T) :
(equivOfEq h).symm = equivOfEq h.symm :=
rfl

@[simp]
theorem equivOfEq_rfl (S : IntermediateField F E) : equivOfEq (rfl : S = S) = AlgEquiv.refl := by
ext; rfl

@[simp]
theorem equivOfEq_trans {S T U : IntermediateField F E} (hST : S = T) (hTU : T = U) :
(equivOfEq hST).trans (equivOfEq hTU) = equivOfEq (hST.trans hTU) :=
rfl

variable (F E)

/-- The bottom intermediate_field is isomorphic to the field. -/
Expand Down Expand Up @@ -305,24 +286,6 @@ theorem _root_.AlgEquiv.fieldRange_eq_top (f : E ≃ₐ[F] K) :

end Lattice

section equivMap

variable {F : Type*} [Field F] {E : Type*} [Field E] [Algebra F E]
{K : Type*} [Field K] [Algebra F K] (L : IntermediateField F E) (f : E →ₐ[F] K)

theorem fieldRange_comp_val : (f.comp L.val).fieldRange = L.map f := toSubalgebra_injective <| by
rw [toSubalgebra_map, AlgHom.fieldRange_toSubalgebra, AlgHom.range_comp, range_val]

/-- An intermediate field is isomorphic to its image under an `AlgHom`
(which is automatically injective) -/
noncomputable def equivMap : L ≃ₐ[F] L.map f :=
(AlgEquiv.ofInjective _ (f.comp L.val).injective).trans (equivOfEq (fieldRange_comp_val L f))

@[simp]
theorem coe_equivMap_apply (x : L) : ↑(equivMap L f x) = f x := rfl

end equivMap

section AdjoinDef

variable (F : Type*) [Field F] {E : Type*} [Field E] [Algebra F E] (S : Set E)
Expand Down
6 changes: 6 additions & 0 deletions Mathlib/FieldTheory/IntermediateField/Algebraic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,12 @@ theorem eq_of_le_of_finrank_eq' [FiniteDimensional F L] (h_le : F ≤ E)
(h_finrank : finrank F L = finrank E L) : F = E :=
eq_of_le_of_finrank_le' h_le h_finrank.le

/-- Mapping a finite dimensional intermediate field along an algebra equivalence gives
a finite-dimensional intermediate field. -/
instance finiteDimensional_map (f : L →ₐ[K] L) [FiniteDimensional K E] :
FiniteDimensional K (E.map f) :=
LinearEquiv.finiteDimensional (IntermediateField.equivMap E f).toLinearEquiv

end FiniteDimensional

theorem isAlgebraic_iff {x : S} : IsAlgebraic K x ↔ IsAlgebraic K (x : L) :=
Expand Down
59 changes: 50 additions & 9 deletions Mathlib/FieldTheory/IntermediateField/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ protected theorem mul_mem {x y : L} : x ∈ S → y ∈ S → x * y ∈ S :=
protected theorem add_mem {x y : L} : x ∈ S → y ∈ S → x + y ∈ S :=
add_mem

/-- An intermediate field is closed under subtraction -/
/-- An intermediate field is closed under subtraction. -/
protected theorem sub_mem {x y : L} : x ∈ S → y ∈ S → x - y ∈ S :=
sub_mem

Expand Down Expand Up @@ -234,7 +234,7 @@ instance instSMulMemClass : SMulMemClass (IntermediateField K L) K L where

end IntermediateField

/-- Turn a subalgebra closed under inverses into an intermediate field -/
/-- Turn a subalgebra closed under inverses into an intermediate field. -/
def Subalgebra.toIntermediateField (S : Subalgebra K L) (inv_mem : ∀ x ∈ S, x⁻¹ ∈ S) :
IntermediateField K L :=
{ S with
Expand All @@ -252,7 +252,7 @@ theorem toIntermediateField_toSubalgebra (S : IntermediateField K L) :
ext
rfl

/-- Turn a subalgebra satisfying `IsField` into an intermediate_field -/
/-- Turn a subalgebra satisfying `IsField` into an intermediate_field. -/
def Subalgebra.toIntermediateField' (S : Subalgebra K L) (hS : IsField S) : IntermediateField K L :=
S.toIntermediateField fun x hx => by
by_cases hx0 : x = 0
Expand All @@ -275,15 +275,15 @@ theorem toIntermediateField'_toSubalgebra (S : IntermediateField K L) :
ext
rfl

/-- Turn a subfield of `L` containing the image of `K` into an intermediate field -/
/-- Turn a subfield of `L` containing the image of `K` into an intermediate field. -/
def Subfield.toIntermediateField (S : Subfield L) (algebra_map_mem : ∀ x, algebraMap K L x ∈ S) :
IntermediateField K L :=
{ S with
algebraMap_mem' := algebra_map_mem }

namespace IntermediateField

/-- An intermediate field inherits a field structure -/
/-- An intermediate field inherits a field structure. -/
instance toField : Field S :=
S.toSubfield.toField

Expand Down Expand Up @@ -396,7 +396,7 @@ instance isScalarTower_mid {R : Type*} [Semiring R] [Algebra L R] [Algebra K R]
[IsScalarTower K L R] : IsScalarTower K S R :=
IsScalarTower.subalgebra' _ _ _ S.toSubalgebra

/-- Specialize `is_scalar_tower_mid` to the common case where the top field is `L` -/
/-- Specialize `is_scalar_tower_mid` to the common case where the top field is `L`. -/
instance isScalarTower_mid' : IsScalarTower K S L :=
inferInstance

Expand Down Expand Up @@ -436,6 +436,10 @@ theorem toSubalgebra_map (f : L →ₐ[K] L') : (S.map f).toSubalgebra = S.toSub
theorem toSubfield_map (f : L →ₐ[K] L') : (S.map f).toSubfield = S.toSubfield.map f :=
rfl

/-- Mapping intermediate fields along the identity does not change them. -/
theorem map_id : S.map (AlgHom.id K L) = S :=
SetLike.coe_injective <| Set.image_id _

theorem map_map {K L₁ L₂ L₃ : Type*} [Field K] [Field L₁] [Algebra K L₁] [Field L₂] [Algebra K L₂]
[Field L₃] [Algebra K L₃] (E : IntermediateField K L₁) (f : L₁ →ₐ[K] L₂) (g : L₂ →ₐ[K] L₃) :
(E.map f).map g = E.map (g.comp f) :=
Expand All @@ -455,7 +459,7 @@ theorem gc_map_comap (f : L →ₐ[K] L') : GaloisConnection (map f) (comap f) :

/-- Given an equivalence `e : L ≃ₐ[K] L'` of `K`-field extensions and an intermediate
field `E` of `L/K`, `intermediateFieldMap e E` is the induced equivalence
between `E` and `E.map e` -/
between `E` and `E.map e`. -/
def intermediateFieldMap (e : L ≃ₐ[K] L') (E : IntermediateField K L) : E ≃ₐ[K] E.map e.toAlgHom :=
e.subalgebraMap E.toSubalgebra

Expand Down Expand Up @@ -595,7 +599,7 @@ variable {S}

section Tower

/-- Lift an intermediate_field of an intermediate_field -/
/-- Lift an intermediate_field of an intermediate_field. -/
def lift {F : IntermediateField K L} (E : IntermediateField K F) : IntermediateField K L :=
E.map (val F)

Expand All @@ -614,7 +618,7 @@ theorem mem_lift {F : IntermediateField K L} {E : IntermediateField K F} (x : F)
x.1 ∈ lift E ↔ x ∈ E :=
Subtype.val_injective.mem_set_image

/-- The algEquiv between an intermediate field and its lift -/
/-- The algEquiv between an intermediate field and its lift. -/
def liftAlgEquiv {E : IntermediateField K L} (F : IntermediateField K E) : ↥F ≃ₐ[K] lift F where
toFun x := ⟨x.1.1, (mem_lift x.1).mpr x.2⟩
invFun x := ⟨⟨x.1, lift_le F x.2⟩, (mem_lift ⟨x.1, lift_le F x.2⟩).mp x.2⟩
Expand Down Expand Up @@ -669,6 +673,43 @@ example {F : IntermediateField K L} {E : IntermediateField F L} : Algebra K E :=

end Tower

section equivMap

variable {F : Type*} [Field F] {E : Type*} [Field E] [Algebra F E]
{K : Type*} [Field K] [Algebra F K] (L : IntermediateField F E) (f : E →ₐ[F] K)

/-- Construct an algebra isomorphism from an equality of intermediate fields. -/
@[simps! apply]
def equivOfEq {S T : IntermediateField F E} (h : S = T) : S ≃ₐ[F] T :=
Subalgebra.equivOfEq _ _ (congr_arg toSubalgebra h)

@[simp]
theorem equivOfEq_symm {S T : IntermediateField F E} (h : S = T) :
(equivOfEq h).symm = equivOfEq h.symm :=
rfl

@[simp]
theorem equivOfEq_rfl (S : IntermediateField F E) : equivOfEq (rfl : S = S) = AlgEquiv.refl :=
AlgEquiv.ext fun _ ↦ rfl

@[simp]
theorem equivOfEq_trans {S T U : IntermediateField F E} (hST : S = T) (hTU : T = U) :
(equivOfEq hST).trans (equivOfEq hTU) = equivOfEq (hST.trans hTU) :=
rfl

theorem fieldRange_comp_val : (f.comp L.val).fieldRange = L.map f := toSubalgebra_injective <| by
rw [toSubalgebra_map, AlgHom.fieldRange_toSubalgebra, AlgHom.range_comp, range_val]

/-- An intermediate field is isomorphic to its image under an `AlgHom`
(which is automatically injective). -/
noncomputable def equivMap : L ≃ₐ[F] L.map f :=
(AlgEquiv.ofInjective _ (f.comp L.val).injective).trans (equivOfEq (fieldRange_comp_val L f))

@[simp]
theorem coe_equivMap_apply (x : L) : ↑(equivMap L f x) = f x := rfl

end equivMap

end IntermediateField

section ExtendScalars
Expand Down
Loading