Skip to content
Closed
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
b4e20db
feat(FieldTheory/Galois/IsGaloisGroup): add restrictHom and quotientM…
xroblot May 30, 2026
db574b0
fix docstrings
xroblot May 30, 2026
2555478
review
xroblot Jun 2, 2026
bf98076
Merge branch 'master' into restrictHom1
xroblot Jun 3, 2026
d1755a9
Undo move
xroblot Jun 4, 2026
de6c8e8
add IsScalarTower.toAlgHom_fieldRange
xroblot Jun 4, 2026
4aa3a99
remove hypo
xroblot Jun 4, 2026
8628ccd
fix args
xroblot Jun 4, 2026
80d425f
Merge branch 'master' into restrictHom1
xroblot Jun 8, 2026
d0c487d
Merge remote-tracking branch 'upstream/master' into restrictHom1
xroblot Jun 10, 2026
ccf9c10
review
xroblot Jun 10, 2026
ef53ddd
remove hypo
xroblot Jun 11, 2026
0a8f6d9
review
xroblot Jun 14, 2026
5b6a71d
review
xroblot Jun 15, 2026
c15aba0
review
xroblot Jun 18, 2026
ac04d07
Merge branch 'master' into restrictHom1
xroblot Jun 18, 2026
eebefbf
move fixingSubgroup_range_algebraMap to FractionRing
xroblot Jun 18, 2026
5effdae
Merge remote-tracking branch 'origin/restrictHom1' into restrictHom1
xroblot Jun 18, 2026
28599c6
Merge branch 'master' into restrictHom1
xroblot Jun 19, 2026
531ed29
attempt
tb65536 Jun 19, 2026
bc48c1f
fix
tb65536 Jun 19, 2026
3246a54
Merge remote-tracking branch 'upstream/master' into restrictHom1-clean
xroblot Jun 19, 2026
0f389b1
Merge commit 'refs/pull/40804/head' of github.com:leanprover-communit…
xroblot Jun 19, 2026
d8fdc25
Merge remote-tracking branch 'upstream/master' into restrictHom1
xroblot Jun 20, 2026
23de532
Review
xroblot Jun 20, 2026
7fbd7b2
remove lemma
xroblot Jun 20, 2026
a007478
Merge remote-tracking branch 'upstream/master' into restrictHom1
xroblot Jun 20, 2026
55f521f
extra line
xroblot Jun 21, 2026
e4d7086
review
xroblot Jun 22, 2026
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
112 changes: 109 additions & 3 deletions Mathlib/FieldTheory/Galois/IsGaloisGroup.lean
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,11 @@ theorem mulEquivCongr_symm_apply_smul (g : G') (x : B) :
@[deprecated (since := "2026-06-19")] alias mulEquivCongr' := mulEquivCongr
@[deprecated (since := "2026-06-19")] alias mulEquivCongr'_apply_smul := mulEquivCongr_apply_smul

theorem mulEquivCongr_mapSubgroup_fixingSubgroup (S : Set B) :
(fixingSubgroup G S).map (mulEquivCongr G G' A B) = fixingSubgroup G' S := by
ext g
simp [Subgroup.map_equiv_eq_comap_symm, mem_fixingSubgroup_iff]

end IsDomain

variable (H H' : Subgroup G) (F F' : IntermediateField K L)
Expand Down Expand Up @@ -430,6 +435,17 @@ instance intermediateField [Finite G] [hGKL : IsGaloisGroup G K L] :
have := hGKL.isGalois
.of_mulEquiv_algEquiv e fun _ _ ↦ rfl

include K in
/-- If `G` is a Galois group on `L/K` and `L/E/K` is a tower of field extensions,
then the fixing subgroup of the image of `E` in `L` is a Galois group on `L/E`. -/
theorem of_isScalarTower [Finite G] [IsGaloisGroup G K L] (E : Type*) [Field E] [Algebra K E]
[Algebra E L] [IsScalarTower K E L] :
IsGaloisGroup (fixingSubgroup G (Set.range (algebraMap E L))) E L := by
rw [← IsScalarTower.toAlgHom_fieldRange K E L]
refine IsGaloisGroup.of_ringEquiv _ _ _ L
(AlgHom.equivFieldRange (IsScalarTower.toAlgHom K E L)).toRingEquiv.symm fun ⟨_, ⟨x, rfl⟩⟩ ↦ ?_
simp [AlgEquiv.symm_apply_eq, Subtype.ext_iff]

@[simp]
theorem card_fixingSubgroup_eq_finrank [Finite G] [IsGaloisGroup G K L] :
Nat.card (fixingSubgroup G (F : Set L)) = Module.finrank F L :=
Expand Down Expand Up @@ -566,6 +582,20 @@ theorem fixingSubgroup_range_algebraMap [Finite G] (A B C : Type*) (H : Subgroup
use algebraMap B (FractionRing B) x
rw [← IsScalarTower.algebraMap_apply, ← IsScalarTower.algebraMap_apply]

open Pointwise in
/-- If `G` is a finite Galois group for `L/K`, `H` is a Galois group for `L/E`, and `E/K` is
Galois, then `H` is a normal subgroup of `G`. -/
theorem normal_of_isGalois (E : Type*) [Field E] [Algebra K E] [Algebra E L] [IsScalarTower K E L]
[Finite G] [IsGaloisGroup H E L] [IsGalois K E] : H.Normal := by
let F := (IsScalarTower.toAlgHom K E L).fieldRange
have : IsGalois K F := .of_algEquiv (IsScalarTower.toAlgHom K E L).equivFieldRange
have hFL : IsGaloisGroup H F L := inferInstanceAs (IsGaloisGroup H (algebraMap E L).range L)
have := isGalois G K L
have : Finite Gal(L/K) := Finite.of_equiv _ (mulEquivAlgEquiv G K L).toEquiv
rw [← fixingSubgroup_fixedPoints G K L H, subgroup_iff.mp hFL,
← mulEquivCongr_mapSubgroup_fixingSubgroup Gal(L/K) G K, MulEquiv.normal_map_iff]
exact IsGalois.fixingSubgroup_normal_of_isGalois F

end IsGaloisGroup

end GaloisCorrespondence
Expand Down Expand Up @@ -635,7 +665,7 @@ theorem mulSemiringActionQuotient_smul_def [MulSemiringAction G B] [SMulDistribC
refine (Quotient.liftOn'_mk'' (· • b) _ g).trans (FaithfulSMul.algebraMap_injective B C ?_)
rw [algebraMap.smul', algebraMap.smul']

theorem isScalarTower_mulSemiringActionQuotient [MulSemiringAction G B] [SMulDistribClass G B C]
instance isScalarTower_mulSemiringActionQuotient [MulSemiringAction G B] [SMulDistribClass G B C]
[IsGaloisGroup N B C] [N.Normal] :
letI := mulSemiringActionQuotient G B C N
IsScalarTower G (G ⧸ N) B :=
Expand All @@ -659,7 +689,7 @@ end Semiring
section Domain

variable (A B C : Type*) [CommRing A] [CommRing B] [CommRing C] [IsDomain C] [Algebra A B]
[Algebra A C] [Algebra B C] [FaithfulSMul A C] [FaithfulSMul B C] [IsScalarTower A B C]
[Algebra A C] [Algebra B C] [FaithfulSMul A B] [FaithfulSMul B C] [IsScalarTower A B C]

/-- If `G` is a Galois group for `C/A`, and the normal subgroup `N ≤ G` is a Galois group for
`C/B`, then the quotient `G ⧸ N` is a Galois group for `B/A`. -/
Expand All @@ -669,6 +699,7 @@ theorem quotient [Finite G] (N : Subgroup G) [N.Normal] [MulSemiringAction G C]
[IsGaloisGroup N B C] :
IsGaloisGroup (G ⧸ N) A B where
faithful.eq_of_smul_eq_smul := fun {g₁} {g₂} ↦ Quotient.inductionOn₂' g₁ g₂ fun g₁ g₂ h ↦ by
have : FaithfulSMul A C := FaithfulSMul.trans A B C
have h' : ∀ g : G, (∀ x : B, g • x = x) → g ∈ N := by
simp [← fixingSubgroup_range_algebraMap G A B C N, mem_fixingSubgroup_iff, ← algebraMap.smul',
(FaithfulSMul.algebraMap_injective B C).eq_iff]
Expand All @@ -685,6 +716,80 @@ theorem quotient [Finite G] (N : Subgroup G) [N.Normal] [MulSemiringAction G C]
have := (FaithfulSMul.algebraMap_injective B C).eq_iff.mpr <| h g
rwa [MulAction.coe_quotient_smul, algebraMap.smul'] at this

/-- If `G` is a Galois group for `C/A`, the normal subgroup `N ≤ G` is a Galois group for `C/B`,
and `G'` is a Galois group for `B/A`, then `G ⧸ N ≃* G'`. -/
noncomputable def quotientMulEquiv [Finite G] [Finite G'] (N : Subgroup G) [N.Normal]
[MulSemiringAction G C] [IsGaloisGroup G A C] [IsGaloisGroup N B C] [MulSemiringAction G' B]
[IsGaloisGroup G' A B] :
G ⧸ N ≃* G' :=
haveI : IsDomain B := (FaithfulSMul.algebraMap_injective B C).isDomain
letI := mulSemiringActionOfNormal G B C N
letI := mulSemiringActionQuotient G B C N
haveI := smulCommClassQuotient G A B C N
haveI := quotient G A B C N
mulEquivCongr (G ⧸ N) G' A B

@[simp]
theorem algebraMap_quotientMulEquiv_smul [Finite G] [Finite G'] (N : Subgroup G) [N.Normal]
[MulSemiringAction G C] [IsGaloisGroup G A C] [IsGaloisGroup N B C] [MulSemiringAction G' B]
[IsGaloisGroup G' A B] (g : G) (x : B) :
algebraMap B C (quotientMulEquiv G G' A B C N g • x) = g • algebraMap B C x := by
haveI : IsDomain B := (FaithfulSMul.algebraMap_injective B C).isDomain
letI := mulSemiringActionOfNormal G B C N
letI := mulSemiringActionQuotient G B C N
haveI := smulCommClassQuotient G A B C N
haveI := quotient G A B C N
rw [← algebraMap_smulOfNormal G B C N g x]
congr
apply mulEquivCongr_apply_smul

attribute [local instance] FractionRing.liftAlgebra in
/-- The restriction homomorphism from the Galois group of `C/A` to the Galois group of `B/A` where
`C/B/A` is a tower of domains with `C/A` and `B/A` Galois. -/
noncomputable def restrictHom [Finite G] [Finite G'] [MulSemiringAction G C] [IsGaloisGroup G A C]
[MulSemiringAction G' B] [IsGaloisGroup G' A B] :
G →* G' :=
haveI : IsDomain B := IsDomain.of_faithfulSMul B C
haveI : IsDomain A := IsDomain.of_faithfulSMul A B
haveI : FaithfulSMul A C := FaithfulSMul.trans A B C
letI : MulSemiringAction G (FractionRing C) :=
IsFractionRing.mulSemiringAction G C (FractionRing C)
letI N := fixingSubgroup G (Set.range (algebraMap (FractionRing B) (FractionRing C)))
haveI : IsGaloisGroup N (FractionRing B) (FractionRing C) :=
of_isScalarTower G (FractionRing A) (FractionRing C) (FractionRing B)
letI : MulSemiringAction G' (FractionRing B) :=
IsFractionRing.mulSemiringAction G' B (FractionRing B)
haveI := isGalois G' (FractionRing A) (FractionRing B)
haveI : N.Normal := normal_of_isGalois G (FractionRing A) (FractionRing C) N (FractionRing B)
(quotientMulEquiv G G' (FractionRing A) (FractionRing B) (FractionRing C) N).toMonoidHom.comp
(QuotientGroup.mk' N)

attribute [local instance] FractionRing.liftAlgebra in
@[simp]
theorem algebraMap_restrictHom_smul [Finite G] [Finite G'] [MulSemiringAction G C]
[IsGaloisGroup G A C] [MulSemiringAction G' B] [IsGaloisGroup G' A B] (g : G) (x : B) :
algebraMap B C (restrictHom G G' A B C g • x) = g • algebraMap B C x := by
have : IsDomain B := IsDomain.of_faithfulSMul B C
have : IsDomain A := IsDomain.of_faithfulSMul A B
have : FaithfulSMul A C := FaithfulSMul.trans A B C
let : MulSemiringAction G (FractionRing C) :=
IsFractionRing.mulSemiringAction G C (FractionRing C)
let : MulSemiringAction G' (FractionRing B) :=
IsFractionRing.mulSemiringAction G' B (FractionRing B)
apply FaithfulSMul.algebraMap_injective C (FractionRing C)
rw [← IsScalarTower.algebraMap_apply,
IsScalarTower.algebraMap_apply B (FractionRing B) (FractionRing C)]
simp only [restrictHom, MulEquiv.toMonoidHom_eq_coe, MonoidHom.coe_comp, MonoidHom.coe_coe,
QuotientGroup.coe_mk', Function.comp_apply]
rw [algebraMap.smul', algebraMap_quotientMulEquiv_smul, ← IsScalarTower.algebraMap_apply,
algebraMap.smul', ← IsScalarTower.algebraMap_apply]

attribute [local instance] FractionRing.liftAlgebra in
theorem restrictHom_surjective [Finite G] [Finite G'] [MulSemiringAction G C]
[IsGaloisGroup G A C] [MulSemiringAction G' B] [IsGaloisGroup G' A B] :
Function.Surjective (restrictHom G G' A B C) := by
simpa [restrictHom] using QuotientGroup.mk_surjective

end Domain

noncomputable section IntermediateField
Expand Down Expand Up @@ -733,7 +838,8 @@ theorem map_quotientMk' [Finite G] [IsGaloisGroup G K L] (h : E ≤ F) :
isInvariant := ⟨fun x h ↦ by
obtain ⟨a, ha⟩ := hE.isInvariant.isInvariant (algebraMap F L x) (by
rintro ⟨g, hg⟩
simpa only [← algebraMap.smul'] using! congr_arg (algebraMap F L) <| h ⟨g, ⟨g, hg, rfl⟩⟩)
rw [MulAction.subgroup_smul_def, ← algebraMap.smul']
exact congr_arg (algebraMap F L) <| h ⟨g, ⟨g, hg, rfl⟩⟩)
exact ⟨a, FaithfulSMul.algebraMap_injective F L
(by rw [← IsScalarTower.algebraMap_apply, ha])⟩⟩ }

Expand Down
Loading