Skip to content

Commit 5ab602a

Browse files
kim-emclaude
andcommitted
feat(Algebra/Group/Subgroup/Map): subgroupOf commutes with map/comap via subgroupMap
Add Subgroup.subgroupOf_map_eq_map_subgroupOf and Subgroup.subgroupOf_comap_eq_comap_subgroupOf (with to_additive), promoting two helpers from the p-core development to general subgroup API, and use them in GroupTheory/PCore. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 7e7afa0 commit 5ab602a

2 files changed

Lines changed: 27 additions & 23 deletions

File tree

Mathlib/Algebra/Group/Subgroup/Map.lean

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,4 +589,29 @@ theorem equivMapOfInjective_coe_mulEquiv (H : Subgroup G) (e : G ≃* G') :
589589
ext
590590
rfl
591591

592+
/-- Restricting the image `K.map f` to `H.map f` is the image of the relative subgroup
593+
`K.subgroupOf H` under the restricted map `f.subgroupMap H`. -/
594+
@[to_additive /-- Restricting the image `K.map f` to `H.map f` is the image of the relative
595+
additive subgroup `K.addSubgroupOf H` under the restricted map `f.addSubgroupMap H`. -/]
596+
theorem subgroupOf_map_eq_map_subgroupOf (f : G →* N) {K H : Subgroup G} (hK : K ≤ H) :
597+
(K.map f).subgroupOf (H.map f) = (K.subgroupOf H).map (f.subgroupMap H) := by
598+
ext ⟨y, hy⟩
599+
rw [mem_subgroupOf]
600+
simp only [mem_map, mem_subgroupOf]
601+
constructor
602+
· rintro ⟨x, hxK, rfl⟩
603+
exact ⟨⟨x, hK hxK⟩, hxK, by ext; rfl⟩
604+
· rintro ⟨⟨x, hxH⟩, hxK, hxy⟩
605+
exact ⟨x, hxK, by simpa using congrArg Subtype.val hxy⟩
606+
607+
/-- Restricting the preimage `K.comap f` to `H'.comap f` is the preimage of the relative subgroup
608+
`K.subgroupOf H'` under the restricted map `f.subgroupComap H'`. -/
609+
@[to_additive /-- Restricting the preimage `K.comap f` to `H'.comap f` is the preimage of the
610+
relative additive subgroup `K.addSubgroupOf H'` under the restricted `f.addSubgroupComap H'`. -/]
611+
theorem subgroupOf_comap_eq_comap_subgroupOf (f : G →* N) (K H' : Subgroup N) :
612+
(K.comap f).subgroupOf (H'.comap f) = (K.subgroupOf H').comap (f.subgroupComap H') := by
613+
ext ⟨x, hx⟩
614+
rw [mem_subgroupOf, mem_comap, mem_comap, mem_subgroupOf]
615+
rfl
616+
592617
end Subgroup

Mathlib/GroupTheory/PCore.lean

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -285,19 +285,6 @@ section Hom
285285

286286
variable {G' : Type*} [Group G']
287287

288-
/-- For `K ≤ H`, restricting the image `K.map f` to `H.map f` is the same as taking the relative
289-
subgroup `K.subgroupOf H` and pushing it through the restricted map `f.subgroupMap H`. -/
290-
private theorem map_subgroupOf_map (f : G →* G') {K : Subgroup G} (hK : K ≤ H) :
291-
(K.map f).subgroupOf (H.map f) = (K.subgroupOf H).map (f.subgroupMap H) := by
292-
ext ⟨y, hy⟩
293-
rw [mem_subgroupOf]
294-
simp only [mem_map, mem_subgroupOf]
295-
constructor
296-
· rintro ⟨x, hxK, rfl⟩
297-
exact ⟨⟨x, hK hxK⟩, hxK, by ext; rfl⟩
298-
· rintro ⟨⟨x, hxH⟩, hxK, hxy⟩
299-
exact ⟨x, hxK, by simpa using congrArg Subtype.val hxy⟩
300-
301288
/-- A group homomorphism sends the `p`-core of `H` into the `p`-core of `H.map f`. -/
302289
theorem map_pCore_le_pCore (f : G →* G') : (pCore p H).map f ≤ pCore p (H.map f) := by
303290
rw [pCore, Subgroup.map_iSup]
@@ -334,7 +321,7 @@ theorem map_pCore_eq_pCore (f : G →* G') (hker : IsPGroup p (f.subgroupMap H).
334321
refine le_antisymm (map_pCore_le_pCore f) ?_
335322
rw [← map_subgroupOf_eq_of_le (pCore_le : pCore p (H.map f) ≤ H.map f),
336323
← map_subgroupOf_eq_of_le (map_mono pCore_le : (pCore p H).map f ≤ H.map f),
337-
map_subgroupOf_map f pCore_le]
324+
subgroupOf_map_eq_map_subgroupOf f pCore_le]
338325
refine map_mono ?_
339326
conv_lhs => rw [← Subgroup.map_comap_eq_self_of_surjective (f.subgroupMap_surjective H)
340327
((pCore p (H.map f)).subgroupOf (H.map f))]
@@ -348,20 +335,12 @@ theorem map_pCore_eq_pCore_of_ker_isPGroup (f : G →* G') (hker : IsPGroup p f.
348335
map_pCore_eq_pCore f <| by
349336
rw [ker_subgroupMap]; exact hker.comap_of_injective H.subtype H.subtype_injective
350337

351-
/-- Restricting the preimage `K.comap f` to `H'.comap f` is the same as taking the relative
352-
subgroup `K.subgroupOf H'` and pulling it back through the restricted map `f.subgroupComap H'`. -/
353-
private theorem comap_subgroupOf_comap (f : G →* G') (K H' : Subgroup G') :
354-
(K.comap f).subgroupOf (H'.comap f) = (K.subgroupOf H').comap (f.subgroupComap H') := by
355-
ext ⟨x, hx⟩
356-
rw [mem_subgroupOf, mem_comap, mem_comap, mem_subgroupOf]
357-
rfl
358-
359338
/-- If `f` has `p`-group kernel, the preimage of the `p`-core of `H'` is contained in the
360339
`p`-core of `H'.comap f`. -/
361340
theorem comap_pCore_le_pCore (f : G →* G') (H' : Subgroup G') (hker : IsPGroup p f.ker) :
362341
(pCore p H').comap f ≤ pCore p (H'.comap f) := by
363342
refine le_pCore_of_le (comap_mono pCore_le) ?_ (isPGroup_pCore.comap_of_ker_isPGroup f hker)
364-
rw [comap_subgroupOf_comap]
343+
rw [subgroupOf_comap_eq_comap_subgroupOf]
365344
exact pCore_subgroupOf_normal.comap _
366345

367346
/-- If `H' ≤ f.range` and `f` has `p`-group kernel, the preimage of the `p`-core of `H'` is exactly

0 commit comments

Comments
 (0)