Skip to content

Commit d31099d

Browse files
xrobloturkud
andcommitted
feat(QuotientGroup): surjectivity and kernel of QuotientGroup.map (#23205)
Prove formulas for the kernel of `QuotientGroup.lift` and `QuotientGroup.map` and that these maps are surjective if the corresponding functions are surjective. Co-authored-by: Yury G. Kudryashov <urkud@urkud.name>
1 parent 819ba93 commit d31099d

File tree

5 files changed

+53
-1
lines changed

5 files changed

+53
-1
lines changed

Mathlib/Algebra/Group/Subgroup/Ker.lean

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,9 @@ def ker (f : G →* M) : Subgroup G :=
233233
f x⁻¹ = f x * f x⁻¹ := by rw [hx, one_mul]
234234
_ = 1 := by rw [← map_mul, mul_inv_cancel, map_one] }
235235

236+
@[to_additive (attr := simp)]
237+
theorem ker_toSubmonoid (f : G →* M) : f.ker.toSubmonoid = MonoidHom.mker f := rfl
238+
236239
@[to_additive (attr := simp)]
237240
theorem mem_ker {f : G →* M} {x : G} : x ∈ f.ker ↔ f x = 1 :=
238241
Iff.rfl
@@ -261,7 +264,8 @@ instance decidableMemKer [DecidableEq M] (f : G →* M) : DecidablePred (· ∈
261264
decidable_of_iff (f x = 1) f.mem_ker
262265

263266
@[to_additive]
264-
theorem comap_ker (g : N →* P) (f : G →* N) : g.ker.comap f = (g.comp f).ker :=
267+
theorem comap_ker {P : Type*} [MulOneClass P] (g : N →* P) (f : G →* N) :
268+
g.ker.comap f = (g.comp f).ker :=
265269
rfl
266270

267271
@[to_additive (attr := simp)]

Mathlib/Algebra/Group/Subgroup/Map.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ def map (f : G →* N) (H : Subgroup G) : Subgroup N :=
116116
theorem coe_map (f : G →* N) (K : Subgroup G) : (K.map f : Set N) = f '' K :=
117117
rfl
118118

119+
@[to_additive (attr := simp)]
120+
theorem map_toSubmonoid (f : G →* G') (K : Subgroup G):
121+
(Subgroup.map f K).toSubmonoid = Submonoid.map f K.toSubmonoid := rfl
122+
119123
@[to_additive (attr := simp)]
120124
theorem mem_map {f : G →* N} {K : Subgroup G} {y : N} : y ∈ K.map f ↔ ∃ x ∈ K, f x = y := Iff.rfl
121125

Mathlib/Algebra/Group/Submonoid/Operations.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,4 +1042,9 @@ theorem map_comap_eq_self {f : F} {S : Submonoid N} (h : S ≤ MonoidHom.mrange
10421042
(S.comap f).map f = S := by
10431043
simpa only [inf_of_le_left h] using map_comap_eq f S
10441044

1045+
@[to_additive]
1046+
theorem map_comap_eq_self_of_surjective {f : F} (h : Function.Surjective f) {S : Submonoid N} :
1047+
map f (comap f S) = S :=
1048+
map_comap_eq_self (MonoidHom.mrange_eq_top_of_surjective _ h ▸ le_top)
1049+
10451050
end Submonoid

Mathlib/Data/Quot.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,17 @@ theorem Quotient.lift_comp_mk {_ : Setoid α} (f : α → β) (h : ∀ a b : α,
297297
Quotient.lift f h ∘ Quotient.mk _ = f :=
298298
rfl
299299

300+
@[simp]
301+
theorem Quotient.lift_surjective_iff {α β : Sort*} {s : Setoid α} (f : α → β)
302+
(h : ∀ (a b : α), a ≈ b → f a = f b) :
303+
Function.Surjective (Quotient.lift f h : Quotient s → β) ↔ Function.Surjective f :=
304+
Quot.surjective_lift h
305+
306+
theorem Quotient.lift_surjective {α β : Sort*} {s : Setoid α} (f : α → β)
307+
(h : ∀ (a b : α), a ≈ b → f a = f b) (hf : Function.Surjective f):
308+
Function.Surjective (Quotient.lift f h : Quotient s → β) :=
309+
(Quot.surjective_lift h).mpr hf
310+
300311
@[simp]
301312
theorem Quotient.lift₂_mk {α : Sort*} {β : Sort*} {γ : Sort*} {_ : Setoid α} {_ : Setoid β}
302313
(f : α → β → γ)

Mathlib/GroupTheory/QuotientGroup/Defs.lean

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,11 +238,27 @@ theorem lift_mk' {φ : G →* M} (HN : N ≤ φ.ker) (g : G) : lift N φ HN (mk
238238
rfl
239239
-- TODO: replace `mk` with `mk'`)
240240

241+
@[to_additive (attr := simp)]
242+
theorem lift_comp_mk' (φ : G →* M) (HN : N ≤ φ.ker) :
243+
(QuotientGroup.lift N φ HN).comp (QuotientGroup.mk' N) = φ :=
244+
rfl
245+
241246
@[to_additive (attr := simp)]
242247
theorem lift_quot_mk {φ : G →* M} (HN : N ≤ φ.ker) (g : G) :
243248
lift N φ HN (Quot.mk _ g : Q) = φ g :=
244249
rfl
245250

251+
@[to_additive]
252+
theorem lift_surjective_of_surjective (φ : G →* M) (hφ : Function.Surjective φ) (HN : N ≤ φ.ker) :
253+
Function.Surjective (QuotientGroup.lift N φ HN) :=
254+
Quotient.lift_surjective _ _ hφ
255+
256+
@[to_additive]
257+
theorem ker_lift (φ : G →* M) (HN : N ≤ φ.ker) :
258+
(QuotientGroup.lift N φ HN).ker = Subgroup.map (QuotientGroup.mk' N) φ.ker := by
259+
rw [← congrArg MonoidHom.ker (lift_comp_mk' N φ HN), ← MonoidHom.comap_ker,
260+
Subgroup.map_comap_eq_self_of_surjective (mk'_surjective N)]
261+
246262
/-- A group homomorphism `f : G →* H` induces a map `G/N →* H/M` if `N ⊆ f⁻¹(M)`. -/
247263
@[to_additive
248264
"An `AddGroup` homomorphism `f : G →+ H` induces a map `G/N →+ H/M` if `N ⊆ f⁻¹(M)`."]
@@ -263,6 +279,18 @@ theorem map_mk' (M : Subgroup H) [M.Normal] (f : G →* H) (h : N ≤ M.comap f)
263279
map N M f h (mk' _ x) = ↑(f x) :=
264280
rfl
265281

282+
@[to_additive]
283+
theorem map_surjective_of_surjective (M : Subgroup H) [M.Normal] (f : G →* H)
284+
(hf : Function.Surjective (mk ∘ f : G → H ⧸ M)) (h : N ≤ M.comap f) :
285+
Function.Surjective (map N M f h) :=
286+
lift_surjective_of_surjective _ _ hf _
287+
288+
@[to_additive]
289+
theorem ker_map (M : Subgroup H) [M.Normal] (f : G →* H) (h : N ≤ Subgroup.comap f M) :
290+
(map N M f h).ker = Subgroup.map (mk' N) (M.comap f) := by
291+
simp_rw [← ker_mk' M, MonoidHom.comap_ker]
292+
exact QuotientGroup.ker_lift _ _ _
293+
266294
@[to_additive]
267295
theorem map_id_apply (h : N ≤ Subgroup.comap (MonoidHom.id _) N := (Subgroup.comap_id N).le) (x) :
268296
map N N (MonoidHom.id _) h x = x :=

0 commit comments

Comments
 (0)