Skip to content

Commit e8f2bd8

Browse files
xroblotAuthor Nametb65536
committed
feat(IsGaloisGroup): add restrictHom (leanprover-community#38864)
This PR adds the restriction map for the Galois group for domains. Given a tower of domains `A ≤ B ≤ C`, `G` a Galois group for `C/A` and `G'` a Galois group for `B/A`, we define: - `restrictHom`: the restriction of the `G`-action on `C` to the `G'`-action on `B`. - `quotientMulEquiv`: the isomorphism between the quotient of `G` by the fixing subgroup of `B` and the Galois group of `B/A`. Supporting lemmas include: - `normal_of_isGalois`: 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`. - `restrictHom_surjective`: the restriction map is surjective. --- <!-- Your PR title will become the first line of the commit message. In this box, the text above the `---` (if not empty) will be appended to the commit message, and can be used to give additional context or details. Please leave a blank newline before the `---`, otherwise GitHub will format the text above it as a title. For details on the "pull request lifecycle" in mathlib, please see: https://leanprover-community.github.io/contribute/index.html In particular, note that most reviewers will only notice your PR if it passes the continuous integration checks. Please ask for help on https://leanprover.zulipchat.com if needed. When merging, all the commits will be squashed into a single commit listing all co-authors. Co-authors in the squash commit are gathered from two sources: First, all authors of commits to this PR branch are included. Thus, one way to add co-authors is to include at least one commit authored by each co-author among the commits in the pull request. If necessary, you may create empty commits to indicate co-authorship, using commands like so: git commit --author="Author Name <author@email.com>" --allow-empty -m "add Author Name as coauthor" Second, co-authors can also be listed in lines at the very bottom of the commit message (that is, directly before the `---`) using the following format: If you are moving or deleting declarations, please include these lines at the bottom of the commit message (before the `---`, and also before any "Co-authored-by" lines) using the following format: Moves: - Vector.* -> List.Vector.* - ... Deletions: - Nat.bit1_add_bit1 - ... Any other comments you want to keep out of the PR commit should go below the `---`, and placed outside this HTML comment, or else they will be invisible to reviewers. If this PR depends on other PRs, please list them below this comment, using the following format: - [ ] depends on: #abc [optional extra text] - [ ] depends on: #xyz [optional extra text] --> - [x] depends on: leanprover-community#38902 - [x] depends on: leanprover-community#38464 - [x] depends on: leanprover-community#40804 [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/from-referrer/) Co-authored-by: Author Name <author@email.com> Co-authored-by: tb65536 <thomas.l.browning@gmail.com>
1 parent b0af307 commit e8f2bd8

1 file changed

Lines changed: 109 additions & 3 deletions

File tree

Mathlib/FieldTheory/Galois/IsGaloisGroup.lean

Lines changed: 109 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,11 @@ theorem mulEquivCongr_symm_apply_smul (g : G') (x : B) :
374374
@[deprecated (since := "2026-06-19")] alias mulEquivCongr' := mulEquivCongr
375375
@[deprecated (since := "2026-06-19")] alias mulEquivCongr'_apply_smul := mulEquivCongr_apply_smul
376376

377+
theorem mulEquivCongr_mapSubgroup_fixingSubgroup (S : Set B) :
378+
(fixingSubgroup G S).map (mulEquivCongr G G' A B) = fixingSubgroup G' S := by
379+
ext g
380+
simp [Subgroup.map_equiv_eq_comap_symm, mem_fixingSubgroup_iff]
381+
377382
end IsDomain
378383

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

438+
include K in
439+
/-- If `G` is a Galois group on `L/K` and `L/E/K` is a tower of field extensions,
440+
then the fixing subgroup of the image of `E` in `L` is a Galois group on `L/E`. -/
441+
theorem of_isScalarTower [Finite G] [IsGaloisGroup G K L] (E : Type*) [Field E] [Algebra K E]
442+
[Algebra E L] [IsScalarTower K E L] :
443+
IsGaloisGroup (fixingSubgroup G (Set.range (algebraMap E L))) E L := by
444+
rw [← IsScalarTower.toAlgHom_fieldRange K E L]
445+
refine IsGaloisGroup.of_ringEquiv _ _ _ L
446+
(AlgHom.equivFieldRange (IsScalarTower.toAlgHom K E L)).toRingEquiv.symm fun ⟨_, ⟨x, rfl⟩⟩ ↦ ?_
447+
simp [AlgEquiv.symm_apply_eq, Subtype.ext_iff]
448+
433449
@[simp]
434450
theorem card_fixingSubgroup_eq_finrank [Finite G] [IsGaloisGroup G K L] :
435451
Nat.card (fixingSubgroup G (F : Set L)) = Module.finrank F L :=
@@ -566,6 +582,20 @@ theorem fixingSubgroup_range_algebraMap [Finite G] (A B C : Type*) (H : Subgroup
566582
use algebraMap B (FractionRing B) x
567583
rw [← IsScalarTower.algebraMap_apply, ← IsScalarTower.algebraMap_apply]
568584

585+
open Pointwise in
586+
/-- If `G` is a finite Galois group for `L/K`, `H` is a Galois group for `L/E`, and `E/K` is
587+
Galois, then `H` is a normal subgroup of `G`. -/
588+
theorem normal_of_isGalois (E : Type*) [Field E] [Algebra K E] [Algebra E L] [IsScalarTower K E L]
589+
[Finite G] [IsGaloisGroup H E L] [IsGalois K E] : H.Normal := by
590+
let F := (IsScalarTower.toAlgHom K E L).fieldRange
591+
have : IsGalois K F := .of_algEquiv (IsScalarTower.toAlgHom K E L).equivFieldRange
592+
have hFL : IsGaloisGroup H F L := inferInstanceAs (IsGaloisGroup H (algebraMap E L).range L)
593+
have := isGalois G K L
594+
have : Finite Gal(L/K) := Finite.of_equiv _ (mulEquivAlgEquiv G K L).toEquiv
595+
rw [← fixingSubgroup_fixedPoints G K L H, subgroup_iff.mp hFL,
596+
← mulEquivCongr_mapSubgroup_fixingSubgroup Gal(L/K) G K, MulEquiv.normal_map_iff]
597+
exact IsGalois.fixingSubgroup_normal_of_isGalois F
598+
569599
end IsGaloisGroup
570600

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

638-
theorem isScalarTower_mulSemiringActionQuotient [MulSemiringAction G B] [SMulDistribClass G B C]
668+
instance isScalarTower_mulSemiringActionQuotient [MulSemiringAction G B] [SMulDistribClass G B C]
639669
[IsGaloisGroup N B C] [N.Normal] :
640670
letI := mulSemiringActionQuotient G B C N
641671
IsScalarTower G (G ⧸ N) B :=
@@ -659,7 +689,7 @@ end Semiring
659689
section Domain
660690

661691
variable (A B C : Type*) [CommRing A] [CommRing B] [CommRing C] [IsDomain C] [Algebra A B]
662-
[Algebra A C] [Algebra B C] [FaithfulSMul A C] [FaithfulSMul B C] [IsScalarTower A B C]
692+
[Algebra A C] [Algebra B C] [FaithfulSMul A B] [FaithfulSMul B C] [IsScalarTower A B C]
663693

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

719+
/-- If `G` is a Galois group for `C/A`, the normal subgroup `N ≤ G` is a Galois group for `C/B`,
720+
and `G'` is a Galois group for `B/A`, then `G ⧸ N ≃* G'`. -/
721+
noncomputable def quotientMulEquiv [Finite G] [Finite G'] (N : Subgroup G) [N.Normal]
722+
[MulSemiringAction G C] [IsGaloisGroup G A C] [IsGaloisGroup N B C] [MulSemiringAction G' B]
723+
[IsGaloisGroup G' A B] :
724+
G ⧸ N ≃* G' :=
725+
haveI : IsDomain B := (FaithfulSMul.algebraMap_injective B C).isDomain
726+
letI := mulSemiringActionOfNormal G B C N
727+
letI := mulSemiringActionQuotient G B C N
728+
haveI := smulCommClassQuotient G A B C N
729+
haveI := quotient G A B C N
730+
mulEquivCongr (G ⧸ N) G' A B
731+
732+
@[simp]
733+
theorem algebraMap_quotientMulEquiv_smul [Finite G] [Finite G'] (N : Subgroup G) [N.Normal]
734+
[MulSemiringAction G C] [IsGaloisGroup G A C] [IsGaloisGroup N B C] [MulSemiringAction G' B]
735+
[IsGaloisGroup G' A B] (g : G) (x : B) :
736+
algebraMap B C (quotientMulEquiv G G' A B C N g • x) = g • algebraMap B C x := by
737+
haveI : IsDomain B := (FaithfulSMul.algebraMap_injective B C).isDomain
738+
letI := mulSemiringActionOfNormal G B C N
739+
letI := mulSemiringActionQuotient G B C N
740+
haveI := smulCommClassQuotient G A B C N
741+
haveI := quotient G A B C N
742+
rw [← algebraMap_smulOfNormal G B C N g x]
743+
congr
744+
apply mulEquivCongr_apply_smul
745+
746+
attribute [local instance] FractionRing.liftAlgebra in
747+
/-- The restriction homomorphism from the Galois group of `C/A` to the Galois group of `B/A` where
748+
`C/B/A` is a tower of domains with `C/A` and `B/A` Galois. -/
749+
noncomputable def restrictHom [Finite G] [Finite G'] [MulSemiringAction G C] [IsGaloisGroup G A C]
750+
[MulSemiringAction G' B] [IsGaloisGroup G' A B] :
751+
G →* G' :=
752+
haveI : IsDomain B := IsDomain.of_faithfulSMul B C
753+
haveI : IsDomain A := IsDomain.of_faithfulSMul A B
754+
haveI : FaithfulSMul A C := FaithfulSMul.trans A B C
755+
letI : MulSemiringAction G (FractionRing C) :=
756+
IsFractionRing.mulSemiringAction G C (FractionRing C)
757+
letI N := fixingSubgroup G (Set.range (algebraMap (FractionRing B) (FractionRing C)))
758+
haveI : IsGaloisGroup N (FractionRing B) (FractionRing C) :=
759+
of_isScalarTower G (FractionRing A) (FractionRing C) (FractionRing B)
760+
letI : MulSemiringAction G' (FractionRing B) :=
761+
IsFractionRing.mulSemiringAction G' B (FractionRing B)
762+
haveI := isGalois G' (FractionRing A) (FractionRing B)
763+
haveI : N.Normal := normal_of_isGalois G (FractionRing A) (FractionRing C) N (FractionRing B)
764+
(quotientMulEquiv G G' (FractionRing A) (FractionRing B) (FractionRing C) N).toMonoidHom.comp
765+
(QuotientGroup.mk' N)
766+
767+
attribute [local instance] FractionRing.liftAlgebra in
768+
@[simp]
769+
theorem algebraMap_restrictHom_smul [Finite G] [Finite G'] [MulSemiringAction G C]
770+
[IsGaloisGroup G A C] [MulSemiringAction G' B] [IsGaloisGroup G' A B] (g : G) (x : B) :
771+
algebraMap B C (restrictHom G G' A B C g • x) = g • algebraMap B C x := by
772+
have : IsDomain B := IsDomain.of_faithfulSMul B C
773+
have : IsDomain A := IsDomain.of_faithfulSMul A B
774+
have : FaithfulSMul A C := FaithfulSMul.trans A B C
775+
let : MulSemiringAction G (FractionRing C) :=
776+
IsFractionRing.mulSemiringAction G C (FractionRing C)
777+
let : MulSemiringAction G' (FractionRing B) :=
778+
IsFractionRing.mulSemiringAction G' B (FractionRing B)
779+
apply FaithfulSMul.algebraMap_injective C (FractionRing C)
780+
rw [← IsScalarTower.algebraMap_apply,
781+
IsScalarTower.algebraMap_apply B (FractionRing B) (FractionRing C)]
782+
simp only [restrictHom, MulEquiv.toMonoidHom_eq_coe, MonoidHom.coe_comp, MonoidHom.coe_coe,
783+
QuotientGroup.coe_mk', Function.comp_apply]
784+
rw [algebraMap.smul', algebraMap_quotientMulEquiv_smul, ← IsScalarTower.algebraMap_apply,
785+
algebraMap.smul', ← IsScalarTower.algebraMap_apply]
786+
787+
attribute [local instance] FractionRing.liftAlgebra in
788+
theorem restrictHom_surjective [Finite G] [Finite G'] [MulSemiringAction G C]
789+
[IsGaloisGroup G A C] [MulSemiringAction G' B] [IsGaloisGroup G' A B] :
790+
Function.Surjective (restrictHom G G' A B C) := by
791+
simpa [restrictHom] using QuotientGroup.mk_surjective
792+
688793
end Domain
689794

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

0 commit comments

Comments
 (0)