Skip to content

Commit 84b31f6

Browse files
committed
feat(Topology/Group/Profinite): Profinite group is limit of finite group (#16992)
Prove that any profinite group is limit of finite groups.
1 parent 71e670b commit 84b31f6

File tree

6 files changed

+183
-2
lines changed

6 files changed

+183
-2
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5097,6 +5097,7 @@ import Mathlib.Topology.Algebra.Affine
50975097
import Mathlib.Topology.Algebra.Algebra
50985098
import Mathlib.Topology.Algebra.Algebra.Rat
50995099
import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic
5100+
import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Limits
51005101
import Mathlib.Topology.Algebra.ClopenNhdofOne
51015102
import Mathlib.Topology.Algebra.ClosedSubgroup
51025103
import Mathlib.Topology.Algebra.ConstMulAction

Mathlib/Algebra/Group/Subgroup/Basic.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,15 @@ theorem inf_subgroupOf_inf_normal_of_left {A' A : Subgroup G} (B : Subgroup G) (
849849
instance normal_inf_normal (H K : Subgroup G) [hH : H.Normal] [hK : K.Normal] : (H ⊓ K).Normal :=
850850
fun n hmem g => ⟨hH.conj_mem n hmem.1 g, hK.conj_mem n hmem.2 g⟩⟩
851851

852+
@[to_additive]
853+
theorem normal_iInf_normal {ι : Type*} {a : ι → Subgroup G}
854+
(norm : ∀ i : ι , (a i).Normal) : (iInf a).Normal := by
855+
constructor
856+
intro g g_in_iInf h
857+
rw [Subgroup.mem_iInf] at g_in_iInf ⊢
858+
intro i
859+
exact (norm i).conj_mem g (g_in_iInf i) h
860+
852861
@[to_additive]
853862
theorem SubgroupNormal.mem_comm {H K : Subgroup G} (hK : H ≤ K) [hN : (H.subgroupOf K).Normal]
854863
{a b : G} (hb : b ∈ K) (h : a * b ∈ H) : b * a ∈ H := by

Mathlib/Topology/Algebra/Category/ProfiniteGrp/Basic.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ disconnected.
2525
2626
* `ofClosedSubgroup` : A closed subgroup of a profinite group is profinite.
2727
28+
# TODO
29+
30+
As discussion in `https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/Refactor.20
31+
Category.20of.20ProfiniteGrp.20and.20ContinuousMulEquiv/near/493290115`
32+
33+
* Refactor the category of `ProfiniteGrp` into one-field structure as in `AlgebraCat`
34+
35+
* Prove `(forget ProfiniteGrp.{u}).ReflectsIsomorphisms` using `profiniteGrpToProfinite`
2836
-/
2937

3038
universe u v
@@ -68,6 +76,7 @@ instance : CoeSort ProfiniteGrp (Type u) where
6876
attribute [instance] group topologicalGroup
6977
ProfiniteAddGrp.addGroup ProfiniteAddGrp.topologicalAddGroup
7078

79+
--TODO: Refactor into one-field structure as in `AlgebraCat`
7180
@[to_additive]
7281
instance : Category ProfiniteGrp where
7382
Hom A B := ContinuousMonoidHom A B
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
/-
2+
Copyright (c) 2024 Nailin Guan. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Nailin Guan, Youle Fang, Jujian Zhang, Yuyang Zhao
5+
-/
6+
import Mathlib.Topology.Algebra.Category.ProfiniteGrp.Basic
7+
import Mathlib.Topology.Algebra.ClopenNhdofOne
8+
9+
/-!
10+
# A profinite group is the projective limit of finite groups
11+
12+
We define the topological group isomorphism between a profinite group and the projective limit of
13+
its quotients by open normal subgroups.
14+
15+
## Main definitions
16+
17+
* `toFiniteQuotientFunctor` : The functor from `OpenNormalSubgroup P` to `FiniteGrp`
18+
sending an open normal subgroup `U` to `P ⧸ U`, where `P : ProfiniteGrp`.
19+
20+
* `toLimit` : The continuous homomorphism from a profinite group `P` to
21+
the projective limit of its quotients by open normal subgroups ordered by inclusion.
22+
23+
* `ContinuousMulEquivLimittoFiniteQuotientFunctor` : The `toLimit` is a
24+
`ContinuousMulEquiv`
25+
26+
## Main Statements
27+
28+
* `OpenNormalSubgroupSubClopenNhdsOfOne` : For any open neighborhood of `1` there is an
29+
open normal subgroup contained in it.
30+
31+
-/
32+
33+
universe u
34+
35+
open CategoryTheory TopologicalGroup
36+
37+
namespace ProfiniteGrp
38+
39+
instance (P : ProfiniteGrp) : SmallCategory (OpenNormalSubgroup P) :=
40+
Preorder.smallCategory (OpenNormalSubgroup ↑P.toProfinite.toTop)
41+
42+
/-- The functor from `OpenNormalSubgroup P` to `FiniteGrp` sending `U` to `P ⧸ U`,
43+
where `P : ProfiniteGrp`. -/
44+
def toFiniteQuotientFunctor (P : ProfiniteGrp) : OpenNormalSubgroup P ⥤ FiniteGrp := {
45+
obj := fun H => FiniteGrp.of (P ⧸ H.toSubgroup)
46+
map := fun fHK => QuotientGroup.map _ _ (.id _) (leOfHom fHK)
47+
map_id _ := QuotientGroup.map_id _
48+
map_comp f g := (QuotientGroup.map_comp_map
49+
_ _ _ (.id _) (.id _) (leOfHom f) (leOfHom g)).symm }
50+
51+
/--The `MonoidHom` from a profinite group `P` to the projective limit of its quotients by
52+
open normal subgroups ordered by inclusion.-/
53+
def toLimit_fun (P : ProfiniteGrp.{u}) : P →*
54+
limit (toFiniteQuotientFunctor P ⋙ forget₂ FiniteGrp ProfiniteGrp) where
55+
toFun p := ⟨fun _ => QuotientGroup.mk p, fun _ => rfl⟩
56+
map_one' := Subtype.val_inj.mp rfl
57+
map_mul' _ _ := Subtype.val_inj.mp rfl
58+
59+
lemma toLimit_fun_continuous (P : ProfiniteGrp.{u}) : Continuous (toLimit_fun P) := by
60+
apply continuous_induced_rng.mpr (continuous_pi _)
61+
intro H
62+
dsimp only [Functor.comp_obj, CompHausLike.toCompHausLike_obj, CompHausLike.compHausLikeToTop_obj,
63+
CompHausLike.coe_of, Functor.comp_map, CompHausLike.toCompHausLike_map,
64+
CompHausLike.compHausLikeToTop_map, Set.mem_setOf_eq, toLimit_fun,
65+
MonoidHom.coe_mk, OneHom.coe_mk, Function.comp_apply]
66+
apply Continuous.mk
67+
intro s _
68+
rw [← (Set.biUnion_preimage_singleton QuotientGroup.mk s)]
69+
refine isOpen_iUnion (fun i ↦ isOpen_iUnion (fun _ ↦ ?_))
70+
convert IsOpen.leftCoset H.toOpenSubgroup.isOpen' (Quotient.out i)
71+
ext x
72+
simp only [Set.mem_preimage, Set.mem_singleton_iff]
73+
nth_rw 1 [← QuotientGroup.out_eq' i, eq_comm, QuotientGroup.eq]
74+
exact Iff.symm (Set.mem_smul_set_iff_inv_smul_mem)
75+
76+
/-- The morphism in the category of `ProfiniteGrp` from a profinite group `P` to
77+
the projective limit of its quotients by open normal subgroups ordered by inclusion.-/
78+
def toLimit (P : ProfiniteGrp.{u}) : P ⟶
79+
limit (toFiniteQuotientFunctor P ⋙ forget₂ FiniteGrp ProfiniteGrp) := {
80+
toLimit_fun P with
81+
continuous_toFun := toLimit_fun_continuous P }
82+
83+
/--An auxiliary result, superceded by `toLimit_surjective`.-/
84+
theorem denseRange_toLimit (P : ProfiniteGrp.{u}) : DenseRange (toLimit P) := by
85+
apply dense_iff_inter_open.mpr
86+
rintro U ⟨s, hsO, hsv⟩ ⟨⟨spc, hspc⟩, uDefaultSpec⟩
87+
simp_rw [← hsv, Set.mem_preimage] at uDefaultSpec
88+
rcases (isOpen_pi_iff.mp hsO) _ uDefaultSpec with ⟨J, fJ, hJ1, hJ2⟩
89+
let M := iInf (fun (j : J) => j.1.1.1)
90+
have hM : M.Normal := Subgroup.normal_iInf_normal fun j => j.1.isNormal'
91+
have hMOpen : IsOpen (M : Set P) := by
92+
rw [Subgroup.coe_iInf]
93+
exact isOpen_iInter_of_finite fun i => i.1.1.isOpen'
94+
let m : OpenNormalSubgroup P := { M with isOpen' := hMOpen }
95+
rcases QuotientGroup.mk'_surjective M (spc m) with ⟨origin, horigin⟩
96+
use (toLimit P).toFun origin
97+
refine ⟨?_, origin, rfl⟩
98+
rw [← hsv]
99+
apply hJ2
100+
intro a a_in_J
101+
let M_to_Na : m ⟶ a := (iInf_le (fun (j : J) => j.1.1.1) ⟨a, a_in_J⟩).hom
102+
rw [← (P.toLimit.toFun origin).property M_to_Na]
103+
show (P.toFiniteQuotientFunctor.map M_to_Na) (QuotientGroup.mk' M origin) ∈ _
104+
rw [horigin]
105+
exact Set.mem_of_eq_of_mem (hspc M_to_Na) (hJ1 a a_in_J).2
106+
107+
theorem toLimit_surjective (P : ProfiniteGrp.{u}) : Function.Surjective (toLimit P) := by
108+
have : IsClosed (Set.range P.toLimit) :=
109+
P.toLimit.continuous_toFun.isClosedMap.isClosed_range
110+
rw [← Set.range_eq_univ, ← closure_eq_iff_isClosed.mpr this,
111+
Dense.closure_eq (denseRange_toLimit P)]
112+
113+
theorem toLimit_injective (P : ProfiniteGrp.{u}) : Function.Injective (toLimit P) := by
114+
show Function.Injective (toLimit P).toMonoidHom
115+
rw [← MonoidHom.ker_eq_bot_iff, Subgroup.eq_bot_iff_forall]
116+
intro x h
117+
by_contra xne1
118+
rcases exist_openNormalSubgroup_sub_open_nhd_of_one (isOpen_compl_singleton)
119+
(Set.mem_compl_singleton_iff.mpr fun a => xne1 a.symm) with ⟨H, hH⟩
120+
exact hH ((QuotientGroup.eq_one_iff x).mp (congrFun (Subtype.val_inj.mpr h) H)) rfl
121+
122+
/-- The topological group isomorphism between a profinite group and the projective limit of
123+
its quotients by open normal subgroups -/
124+
noncomputable def continuousMulEquivLimittoFiniteQuotientFunctor (P : ProfiniteGrp.{u}) :
125+
P ≃ₜ* (limit (toFiniteQuotientFunctor P ⋙ forget₂ FiniteGrp ProfiniteGrp)) := {
126+
(Continuous.homeoOfEquivCompactToT2 (f := Equiv.ofBijective _
127+
⟨toLimit_injective P, toLimit_surjective P⟩)
128+
P.toLimit.continuous_toFun)
129+
with
130+
map_mul' := (toLimit P).map_mul' }
131+
132+
--TODO : Refactor using `(forget ProfiniteGrp.{u}).ReflectsIsomorphisms` after it is proved.
133+
/-- The isomorphism in the category of profinite group between a profinite group and
134+
the projective limit of its quotients by open normal subgroups -/
135+
noncomputable def isoLimittoFiniteQuotientFunctor (P : ProfiniteGrp.{u}) :
136+
P ≅ (limit (toFiniteQuotientFunctor P ⋙ forget₂ FiniteGrp ProfiniteGrp)) where
137+
hom := P.toLimit
138+
inv := { (continuousMulEquivLimittoFiniteQuotientFunctor P).symm.toMonoidHom with
139+
continuous_toFun := (continuousMulEquivLimittoFiniteQuotientFunctor P).continuous_invFun}
140+
hom_inv_id := by
141+
ext x
142+
exact ContinuousMulEquiv.symm_apply_apply
143+
(continuousMulEquivLimittoFiniteQuotientFunctor P) x
144+
inv_hom_id := by
145+
ext x
146+
exact ContinuousMulEquiv.apply_symm_apply
147+
(continuousMulEquivLimittoFiniteQuotientFunctor P) x
148+
149+
end ProfiniteGrp

Mathlib/Topology/Algebra/ClopenNhdofOne.lean

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Nailin Guan, Yi Song, Xuchun Li
66
import Mathlib.GroupTheory.Index
77
import Mathlib.Topology.Algebra.ClosedSubgroup
88
import Mathlib.Topology.Algebra.OpenSubgroup
9+
import Mathlib.Topology.Separation.Profinite
910
/-!
1011
# Existence of an open normal subgroup in any clopen neighborhood of the neutral element
1112
@@ -28,3 +29,15 @@ theorem exist_openNormalSubgroup_sub_clopen_nhd_of_one {G : Type*} [Group G] [To
2829
exact fun _ b ↦ hH (H.normalCore_le b)
2930

3031
end TopologicalGroup
32+
33+
namespace ProfiniteGrp
34+
35+
theorem exist_openNormalSubgroup_sub_open_nhd_of_one {G : Type*} [Group G] [TopologicalSpace G]
36+
[TopologicalGroup G] [CompactSpace G] [TotallyDisconnectedSpace G] {U : Set G}
37+
(UOpen : IsOpen U) (einU : 1 ∈ U) : ∃ H : OpenNormalSubgroup G, (H : Set G) ⊆ U := by
38+
rcases ((Filter.HasBasis.mem_iff' ((nhds_basis_clopen (1 : G))) U ).mp <|
39+
mem_nhds_iff.mpr (by use U)) with ⟨W, hW, h⟩
40+
rcases TopologicalGroup.exist_openNormalSubgroup_sub_clopen_nhd_of_one hW.2 hW.1 with ⟨H, hH⟩
41+
exact ⟨H, fun _ a ↦ h (hH a)⟩
42+
43+
end ProfiniteGrp

Mathlib/Topology/Algebra/OpenSubgroup.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/-
22
Copyright (c) 2019 Johan Commelin. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: Johan Commelin, Nailin Guan
4+
Authors: Johan Commelin, Nailin Guan, Yi Song, Xuchun Li
55
-/
66
import Mathlib.Algebra.Module.Submodule.Lattice
77
import Mathlib.RingTheory.Ideal.Defs
@@ -10,7 +10,7 @@ import Mathlib.Topology.Algebra.Ring.Basic
1010
import Mathlib.Topology.Sets.Opens
1111

1212
/-!
13-
# Open subgroups of a topological groups
13+
# Open subgroups of a topological group
1414
1515
This files builds the lattice `OpenSubgroup G` of open subgroups in a topological group `G`,
1616
and its additive version `OpenAddSubgroup`. This lattice has a top element, the subgroup of all

0 commit comments

Comments
 (0)