@@ -9,6 +9,8 @@ public import Mathlib.Topology.Maps.Basic
99public import Mathlib.Topology.Homeomorph.Quotient
1010public import Mathlib.Topology.Constructions
1111public import Mathlib.Data.Setoid.Basic
12+ public import Mathlib.Topology.Algebra.Group.Quotient
13+
1214/-!
1315# Bourbaki Strict Maps
1416
@@ -33,6 +35,18 @@ We provide several equivalent ways to characterize a strict map `f`:
3335 the canonical bijection `Quotient (Setoid.ker f) ≃ Set.range f` is a homeomorphism.
3436* `Topology.isStrictMap_iff_isEmbedding_kerLift`: `f` is strict if and only if
3537 the canonical injection `Quotient (Setoid.ker f) → Y` (`Setoid.kerLift f`) is an embedding.
38+
39+ ### Group homomorphisms
40+
41+ In general, the product (in the sense of `Prod.map`) of two strict maps need not be strict.
42+ But thanks to `MonoidHom.isOpenQuotientMap_of_isQuotientMap`, we can replace `IsQuotientMap`
43+ by `IsOpenQuotientMap` in the setting of group homomorphisms. Therefore we provide several
44+ important properties of strict group homomorphisms :
45+
46+ * `isStrictMap_iff_isOpenQuotientMap_rangeRestrict`: `f` is a strict group homomorphism if
47+ and only if the `rangeRestrict` of `f` is an open quotient map.
48+ * `isStrictMap_prodMap`: The product (in the sense of Prod.map) of strict group homomorphisms
49+ is strict.
3650 -/
3751
3852@[expose] public section
@@ -153,4 +167,39 @@ lemma isEmbedding_iff_isStrictMap_injective :
153167 (Homeomorph.Quotient.congrRight <| by simp [f_inj.eq_iff]).trans Homeomorph.quotientBot
154168 exact f_strict.comp Φ.symm.isEmbedding
155169
170+ /-- Strict maps are preserved when precomposing with a homeomorphism. -/
171+ lemma Homeomorph.isStrictMap_comp_iff (e : X ≃ₜ Y) {f : Y → Z} :
172+ IsStrictMap (f ∘ e) ↔ IsStrictMap f :=
173+ e.isQuotientMap.isStrictMap_iff.symm
174+
175+ /-- Strict maps are preserved when postcomposing with a homeomorphism. -/
176+ lemma Homeomorph.comp_isStrictMap_iff (e : Y ≃ₜ Z) {f : X → Y} :
177+ IsStrictMap (e ∘ f) ↔ IsStrictMap f :=
178+ e.isEmbedding.isStrictMap_iff.symm
179+
156180end Topology
181+
182+ namespace MonoidHom
183+
184+ variable {G H G' H' : Type *} [Group G'] [Group H'] [Group G] [Group H] (f : G →* H) (g : G' →* H')
185+ [TopologicalSpace G] [IsTopologicalGroup G] [TopologicalSpace H]
186+
187+ /-- A group homomorphism is strict if and only if its `rangeRestrict` is an open quotient map. -/
188+ @[to_additive] lemma isStrictMap_iff_isOpenQuotientMap_rangeRestrict :
189+ IsStrictMap f ↔ IsOpenQuotientMap f.rangeRestrict := by
190+ rw [isOpenQuotientMap_iff_isQuotientMap]
191+ rfl
192+
193+ variable {f g} [TopologicalSpace G'] [IsTopologicalGroup G'] [TopologicalSpace H']
194+
195+ /-- The product (in the sense of `Prod.map`) of strict group homomorphisms is strict -/
196+ @ [to_additive isStrictMap_prodMap] lemma isStrictMap_prodMap (hf : IsStrictMap f)
197+ (hg : IsStrictMap g) : IsStrictMap (f.prodMap g) := by
198+ rw [isStrictMap_iff_isOpenQuotientMap_rangeRestrict] at hf hg ⊢
199+ let aux : (f.prodMap g).range ≃ₜ f.range × g.range :=
200+ (Homeomorph.setCongr (by simp [Subgroup.coe_prod])).trans (Homeomorph.Set.prod _ _)
201+ exact aux.symm.isOpenQuotientMap.comp (hf.prodMap hg)
202+
203+ -- TODO Add the lemma `isStrictMap_piMap` once `MonoidHom.piMap` has been defined.
204+
205+ end MonoidHom
0 commit comments