|
| 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 |
0 commit comments