Skip to content

Commit e039464

Browse files
committed
feat: more API specific to strict group homs (#41238)
* Move the section of `Topology.Maps.Strict.Basic` about group homs to a new file `Topology.Maps.Strict.Group` * add more criterions for strictness of group homs * the first isomorphism theorem holds for strict group homs, yielding a [ContinuousMulEquiv](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Topology/Algebra/ContinuousMonoidHom.html#ContinuousMulEquiv) * various tweaks to namespaces and variables throughout the two files.
1 parent 19e77d2 commit e039464

3 files changed

Lines changed: 131 additions & 54 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7986,6 +7986,7 @@ public import Mathlib.Topology.Maps.Proper.Basic
79867986
public import Mathlib.Topology.Maps.Proper.CompactlyGenerated
79877987
public import Mathlib.Topology.Maps.Proper.UniversallyClosed
79887988
public import Mathlib.Topology.Maps.Strict.Basic
7989+
public import Mathlib.Topology.Maps.Strict.Group
79897990
public import Mathlib.Topology.MetricSpace.Algebra
79907991
public import Mathlib.Topology.MetricSpace.Antilipschitz
79917992
public import Mathlib.Topology.MetricSpace.Basic

Mathlib/Topology/Maps/Strict/Basic.lean

Lines changed: 26 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ public import Mathlib.Topology.Maps.Basic
99
public import Mathlib.Topology.Homeomorph.Quotient
1010
public import Mathlib.Topology.Constructions
1111
public import Mathlib.Data.Setoid.Basic
12-
public import Mathlib.Topology.Algebra.Group.Quotient
1312

1413
/-!
1514
# Bourbaki Strict Maps
@@ -35,18 +34,6 @@ We provide several equivalent ways to characterize a strict map `f`:
3534
the canonical bijection `Quotient (Setoid.ker f) ≃ Set.range f` is a homeomorphism.
3635
* `Topology.isStrictMap_iff_isEmbedding_kerLift`: `f` is strict if and only if
3736
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.
5037
-/
5138

5239
@[expose] public section
@@ -56,8 +43,9 @@ open Function Set Topology Setoid
5643
namespace Topology
5744

5845
variable {X Y Z : Type*} [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
59-
(f : X → Y) {g : Y → Z}
46+
{f : X → Y} {g : Y → Z}
6047

48+
variable (f) in
6149
/-- A map is a strict map in the sense of Bourbaki if the natural map to its image
6250
is a quotient map. -/
6351
def IsStrictMap : Prop :=
@@ -67,8 +55,6 @@ lemma isStrictMap_iff_isQuotientMap_rangeFactorization :
6755
IsStrictMap f ↔ IsQuotientMap (Set.rangeFactorization f) :=
6856
Iff.rfl
6957

70-
variable {f}
71-
7258
/-- A map is a strict map if and only if the canonical bijection
7359
`Quotient (Setoid.ker f) ≃ Set.range f` is a homeomorphism. -/
7460
theorem isStrictMap_iff_isHomeomorph_quotientKerEquivRange :
@@ -80,10 +66,13 @@ theorem isStrictMap_iff_isHomeomorph_quotientKerEquivRange :
8066

8167
/-- The homeomorphism `Quotient (Setoid.ker f) ≃ₜ Set.range f` given by a strict map `f`.
8268
This is the homeomorphism obtained from the first isomorphism theorem. -/
83-
noncomputable def Homeomorph.quotientKerEquivRange (hf : IsStrictMap f) :
69+
noncomputable def _root_.Homeomorph.quotientKerEquivRange (hf : IsStrictMap f) :
8470
Quotient (Setoid.ker f) ≃ₜ Set.range f :=
8571
(isStrictMap_iff_isHomeomorph_quotientKerEquivRange.mp hf).homeomorph
8672

73+
@[deprecated (since := "2026-07-10")] protected alias Homeomorph.quotientKerEquivRange :=
74+
Homeomorph.quotientKerEquivRange
75+
8776
/-- A map is a strict map if and only if the canonical injection `Quotient (Setoid.ker f) → Y`
8877
(`Setoid.kerLift f`) is an embedding. -/
8978
theorem isStrictMap_iff_isEmbedding_kerLift :
@@ -98,24 +87,33 @@ lemma IsStrictMap.continuous {f : X → Y} (hf : IsStrictMap f) : Continuous f :
9887
exact continuous_rangeFactorization_iff.mp hf.continuous
9988

10089
/-- A open continuous map is a strict map. -/
101-
lemma IsOpenMap.isStrictMap (ho : IsOpenMap f) (h_cont : Continuous f) :
90+
lemma _root_.IsOpenMap.isStrictMap (ho : IsOpenMap f) (h_cont : Continuous f) :
10291
IsStrictMap f := by
10392
rw [isStrictMap_iff_isQuotientMap_rangeFactorization]
10493
exact (ho.subtype_mk fun x => ⟨x, rfl⟩).isQuotientMap
10594
h_cont.rangeFactorization Set.rangeFactorization_surjective
10695

96+
@[deprecated (since := "2026-07-10")] protected alias IsOpenMap.isStrictMap :=
97+
IsOpenMap.isStrictMap
98+
10799
/-- A closed continuous map is a strict map. -/
108-
lemma IsClosedMap.isStrictMap (hc : IsClosedMap f) (h_cont : Continuous f) :
100+
lemma _root_.IsClosedMap.isStrictMap (hc : IsClosedMap f) (h_cont : Continuous f) :
109101
IsStrictMap f := by
110102
rw [isStrictMap_iff_isQuotientMap_rangeFactorization]
111103
exact (hc.subtype_mk fun x => ⟨x, rfl⟩).isQuotientMap
112104
h_cont.rangeFactorization Set.rangeFactorization_surjective
113105

106+
@[deprecated (since := "2026-07-10")] protected alias IsClosedMap.isStrictMap :=
107+
IsClosedMap.isStrictMap
108+
114109
/-- A homeomorphism is a strict map. -/
115-
lemma IsHomeomorph.isStrictMap (f_homeo : IsHomeomorph f) :
110+
lemma _root_.IsHomeomorph.isStrictMap (f_homeo : IsHomeomorph f) :
116111
IsStrictMap f :=
117112
f_homeo.isOpenMap.isStrictMap f_homeo.continuous
118113

114+
@[deprecated (since := "2026-07-10")] protected alias IsHomeomorph.isStrictMap :=
115+
IsHomeomorph.isStrictMap
116+
119117
/-- The identity is a strict map. -/
120118
lemma IsStrictMap.id : IsStrictMap (id : X → X) := IsHomeomorph.id.isStrictMap
121119

@@ -174,45 +172,19 @@ lemma isHomeomorph_iff_isStrictMap_bijective :
174172
and_assoc]
175173

176174
/-- Strict maps are preserved when precomposing with a homeomorphism. -/
177-
lemma Homeomorph.isStrictMap_comp_iff (e : X ≃ₜ Y) {f : Y → Z} :
175+
lemma _root_.Homeomorph.isStrictMap_comp_iff (e : X ≃ₜ Y) {f : Y → Z} :
178176
IsStrictMap (f ∘ e) ↔ IsStrictMap f :=
179177
e.isQuotientMap.isStrictMap_iff.symm
180178

179+
@[deprecated (since := "2026-07-10")] protected alias Homeomorph.isStrictMap_comp_iff :=
180+
Homeomorph.isStrictMap_comp_iff
181+
181182
/-- Strict maps are preserved when postcomposing with a homeomorphism. -/
182-
lemma Homeomorph.comp_isStrictMap_iff (e : Y ≃ₜ Z) {f : X → Y} :
183+
lemma _root_.Homeomorph.comp_isStrictMap_iff (e : Y ≃ₜ Z) {f : X → Y} :
183184
IsStrictMap (e ∘ f) ↔ IsStrictMap f :=
184185
e.isEmbedding.isStrictMap_iff.symm
185186

186-
end Topology
187-
188-
namespace MonoidHom
189-
190-
variable {G H G' H' : Type*} [Group G'] [Group H'] [Group G] [Group H] (f : G →* H) (g : G' →* H')
191-
[TopologicalSpace G] [IsTopologicalGroup G] [TopologicalSpace H]
192-
193-
/-- A group homomorphism is strict if and only if its `rangeRestrict` is an open quotient map. -/
194-
@[to_additive] lemma isStrictMap_iff_isOpenQuotientMap_rangeRestrict :
195-
IsStrictMap f ↔ IsOpenQuotientMap f.rangeRestrict := by
196-
rw [isOpenQuotientMap_iff_isQuotientMap]
197-
rfl
198-
199-
variable {f g} [TopologicalSpace G'] [IsTopologicalGroup G'] [TopologicalSpace H']
187+
@[deprecated (since := "2026-07-10")] protected alias Homeomorph.comp_isStrictMap_iff :=
188+
Homeomorph.comp_isStrictMap_iff
200189

201-
/-- The product (in the sense of `Prod.map`) of group homomorphisms is strict if and only if each
202-
of the morphisms is strict. -/
203-
@[to_additive isStrictMap_prodMap_iff] lemma isStrictMap_prodMap_iff :
204-
IsStrictMap (f.prodMap g) ↔ IsStrictMap f ∧ IsStrictMap g := by
205-
simp_rw [isStrictMap_iff_isOpenQuotientMap_rangeRestrict]
206-
let Φ : (f.prodMap g).range ≃ₜ f.range × g.range :=
207-
(Homeomorph.setCongr (by simp [Subgroup.coe_prod])).trans (Homeomorph.Set.prod _ _)
208-
have eq : Φ ∘ (f.prodMap g).rangeRestrict = f.rangeRestrict.prodMap g.rangeRestrict := rfl
209-
rw [← Φ.comp_isOpenQuotientMap_iff, eq, MonoidHom.coe_prodMap, isOpenQuotientMap_prodMap_iff]
210-
211-
/-- The product (in the sense of `Prod.map`) of strict group homomorphisms is strict -/
212-
@[to_additive isStrictMap_prodMap] lemma isStrictMap_prodMap (hf : IsStrictMap f)
213-
(hg : IsStrictMap g) : IsStrictMap (f.prodMap g) :=
214-
isStrictMap_prodMap_iff.mpr ⟨hf, hg⟩
215-
216-
-- TODO Add the lemma `isStrictMap_piMap` once `MonoidHom.piMap` has been defined.
217-
218-
end MonoidHom
190+
end Topology
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/-
2+
Copyright (c) 2026 Ziyan Wei. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Ziyan Wei, Anatole Dedecker
5+
-/
6+
module
7+
8+
public import Mathlib.GroupTheory.QuotientGroup.Basic
9+
public import Mathlib.Topology.Algebra.ContinuousMonoidHom
10+
public import Mathlib.Topology.Algebra.Group.Quotient
11+
public import Mathlib.Topology.Maps.Strict.Basic
12+
13+
/-!
14+
# Strict Group Homomorphisms
15+
16+
In this file, we study homomorphisms of topological groups which are *strict* in the sense
17+
of `Topology.IsStrictMap`.
18+
19+
We provide specialized variations of general facts about `IsStrictMap` for convenience.
20+
But we also show that strict group homomorphisms enjoy some extra properties compared to general
21+
strict maps. Namely, we provide:
22+
* `isStrictMap_iff_isOpenQuotientMap_rangeRestrict`: `f` is a strict group homomorphism if
23+
and only if the `rangeRestrict` of `f` is an *open* quotient map. This ultimately relies
24+
on `MonoidHom.isOpenQuotientMap_of_isQuotientMap`.
25+
* `isStrictMap_prodMap`: The product (in the sense of `MonoidHom.prodMap`) of strict group
26+
homomorphisms is strict. Note that this result is false for general maps; what makes things work
27+
in our context is that, unlike `IsQuotientMap`, `IsOpenQuotientMap` is stable under product.
28+
-/
29+
30+
@[expose] public section
31+
32+
open Function Set Topology QuotientGroup
33+
34+
namespace MonoidHom
35+
36+
variable {G H G' H' : Type*} [Group G'] [Group H'] [Group G] [Group H] {f : G →* H} {g : G' →* H'}
37+
[TopologicalSpace G] [TopologicalSpace H]
38+
39+
/-- A group homomorphism is strict if and only if its `QuotientGroup.kerLift` is an embedding. -/
40+
@[to_additive /-- An additive group homomorphism is strict if and only if its
41+
`QuotientAddGroup.kerLift` is an embedding. -/]
42+
protected lemma isStrictMap_iff_isEmbedding_kerLift :
43+
IsStrictMap f ↔ IsEmbedding (kerLift f) := by
44+
-- Note: `G ⧸ MonoidHom.ker f` and `G ⧸ Setoid.ker f` are not definitionally equal, so
45+
-- using `Topology.isStrictMap_iff_isEmbedding_kerLift` is too painful here.
46+
simp_rw [isEmbedding_iff_isStrictMap_injective, kerLift_injective, and_true,
47+
(isQuotientMap_mk _).isStrictMap_iff]
48+
rfl
49+
50+
/-- A group homomorphism is strict if and only if the canonical isomorphism
51+
`G ⧸ f.ker ≃ f.range` is a homeomorphism. -/
52+
@[to_additive /-- An additive group homomorphism is strict if and only if the canonical isomorphism
53+
`G ⧸ f.ker ≃ f.range` is a homeomorphism. -/]
54+
protected lemma isStrictMap_iff_isHomeomorph_quotientKerEquivRange :
55+
IsStrictMap f ↔ IsHomeomorph (quotientKerEquivRange f) := by
56+
-- Note: `G ⧸ MonoidHom.ker f` and `G ⧸ Setoid.ker f` are not definitionally equal, so
57+
-- using `Topology.isStrictMap_iff_isHomeomorph_quotientKerEquivRange` is too painful here.
58+
simp_rw [isHomeomorph_iff_isStrictMap_bijective, EquivLike.bijective, and_true,
59+
(isQuotientMap_mk _).isStrictMap_iff, IsEmbedding.subtypeVal.isStrictMap_iff]
60+
rfl
61+
62+
/-- The isomorphism of topological groups `G ⧸ f.ker ≃ f.range` given by a strict group
63+
homomorphism `f`. This is an avatar of the first isomorphism theorem. -/
64+
@[to_additive /-- The isomorphism of topological additive groups `G ⧸ f.ker ≃ f.range` given by a
65+
strict additive group homomorphism `f`. This is an avatar of the first isomorphism theorem. -/]
66+
noncomputable def _root_.ContinuousMulEquiv.quotientKerEquivRange
67+
(hf : IsStrictMap f) : G ⧸ f.ker ≃ₜ* f.range where
68+
toMulEquiv := QuotientGroup.quotientKerEquivRange f
69+
__ := (f.isStrictMap_iff_isHomeomorph_quotientKerEquivRange.mp hf).homeomorph
70+
71+
variable [IsTopologicalGroup G]
72+
73+
/-- A group homomorphism is strict if and only if its `rangeRestrict` is an open quotient map. -/
74+
@[to_additive /-- An additive group homomorphism is strict if and only if its `rangeRestrict` is an
75+
open quotient map. -/]
76+
protected lemma isStrictMap_iff_isOpenQuotientMap_rangeRestrict :
77+
IsStrictMap f ↔ IsOpenQuotientMap f.rangeRestrict := by
78+
rw [isOpenQuotientMap_iff_isQuotientMap]
79+
rfl
80+
81+
variable [TopologicalSpace G'] [IsTopologicalGroup G'] [TopologicalSpace H']
82+
83+
/-- The product (in the sense of `Prod.map`) of group homomorphisms is strict if and only if each
84+
of the homomorphisms is strict. -/
85+
@[to_additive isStrictMap_prodMap_iff /-- The product (in the sense of `Prod.map`) of additive group
86+
homomorphisms is strict if and only if each of the homomorphisms is strict. -/]
87+
protected lemma isStrictMap_prodMap_iff :
88+
IsStrictMap (f.prodMap g) ↔ IsStrictMap f ∧ IsStrictMap g := by
89+
simp_rw [MonoidHom.isStrictMap_iff_isOpenQuotientMap_rangeRestrict]
90+
let Φ : (f.prodMap g).range ≃ₜ f.range × g.range :=
91+
(Homeomorph.setCongr (by simp [Subgroup.coe_prod])).trans (Homeomorph.Set.prod _ _)
92+
have eq : Φ ∘ (f.prodMap g).rangeRestrict = f.rangeRestrict.prodMap g.rangeRestrict := rfl
93+
rw [← Φ.comp_isOpenQuotientMap_iff, eq, MonoidHom.coe_prodMap, isOpenQuotientMap_prodMap_iff]
94+
95+
/-- The product (in the sense of `Prod.map`) of strict group homomorphisms is strict. -/
96+
@[to_additive isStrictMap_prodMap /-- The product (in the sense of `Prod.map`) of strict additive
97+
group homomorphisms is strict. -/]
98+
protected lemma isStrictMap_prodMap (hf : IsStrictMap f)
99+
(hg : IsStrictMap g) : IsStrictMap (f.prodMap g) :=
100+
MonoidHom.isStrictMap_prodMap_iff.mpr ⟨hf, hg⟩
101+
102+
-- TODO: Add the lemma `isStrictMap_piMap` once `MonoidHom.piMap` has been defined.
103+
104+
end MonoidHom

0 commit comments

Comments
 (0)