Skip to content

Commit 02cb044

Browse files
xroblotPaul-Lez
authored andcommitted
feat(GroupTheory/Congruences): add the equiv between congruence relations on a group and its normal subgroup (#23269)
Let `G` be a group, we prove ```lean { N : Subgroup G // N.Normal } ≃o Con G ``` Co-authored-by: Xavier Roblot <46200072+xroblot@users.noreply.github.com>
1 parent 5ee38e4 commit 02cb044

File tree

1 file changed

+73
-6
lines changed

1 file changed

+73
-6
lines changed

Mathlib/GroupTheory/QuotientGroup/Defs.lean

Lines changed: 73 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@ protected def con : Con G where
5353
instance Quotient.group : Group (G ⧸ N) :=
5454
(QuotientGroup.con N).group
5555

56+
/--
57+
The congruence relation defined by the kernel of a group homomorphism is equal to its kernel
58+
as a congruence relation.
59+
-/
60+
@[to_additive QuotientAddGroup.con_ker_eq_addConKer
61+
"The additive congruence relation defined by the kernel of an additive group homomorphism is
62+
equal to its kernel as an additive congruence relation."]
63+
theorem con_ker_eq_conKer (f : G →* M) : QuotientGroup.con f.ker = Con.ker f := by
64+
ext
65+
rw [QuotientGroup.con, Con.rel_mk, Setoid.comm', leftRel_apply, Con.ker_rel, MonoidHom.eq_iff]
66+
5667
/-- The group homomorphism from `G` to `G/N`. -/
5768
@[to_additive "The additive group homomorphism from `G` to `G/N`."]
5869
def mk' : G →* G ⧸ N :=
@@ -150,17 +161,73 @@ theorem mk_zpow (a : G) (n : ℤ) : ((a ^ n : G) : Q) = (a : Q) ^ n :=
150161

151162
@[to_additive (attr := simp)] lemma map_mk'_self : N.map (mk' N) = ⊥ := by aesop
152163

164+
/--
165+
The subgroup defined by the class of `1` for a congruence relation on a group.
166+
-/
167+
@[to_additive
168+
"The `AddSubgroup` defined by the class of `0` for an additive congruence relation
169+
on an `AddGroup`."]
170+
protected def _root_.Con.subgroup (c : Con G) : Subgroup G where
171+
carrier := { x | c x 1 }
172+
one_mem' := c.refl 1
173+
mul_mem' hx hy := by simpa using c.mul hx hy
174+
inv_mem' h := by simpa using c.inv h
175+
176+
@[to_additive (attr := simp)]
177+
theorem _root_.Con.mem_subgroup_iff {c : Con G} {x : G} :
178+
x ∈ c.subgroup ↔ c x 1 := Iff.rfl
179+
180+
@[to_additive]
181+
instance (c : Con G) : c.subgroup.Normal :=
182+
fun x hx g ↦ by simpa using (c.mul (c.mul (c.refl g) hx) (c.refl g⁻¹))⟩
183+
184+
@[to_additive (attr := simp)]
185+
theorem _root_.Con.subgroup_quotientGroupCon (H : Subgroup G) [H.Normal] :
186+
(QuotientGroup.con H).subgroup = H := by
187+
ext
188+
simp [QuotientGroup.con, leftRel_apply]
189+
190+
@[to_additive (attr := simp)]
191+
theorem con_subgroup (c : Con G) :
192+
QuotientGroup.con c.subgroup = c := by
193+
ext x y
194+
rw [QuotientGroup.con, Con.rel_mk, leftRel_apply, Con.mem_subgroup_iff]
195+
exact ⟨fun h ↦ by simpa using c.mul (c.refl x) (c.symm h),
196+
fun h ↦ by simpa using c.mul (c.refl x⁻¹) (c.symm h)⟩
197+
198+
/--
199+
The normal subgroups correspond to the congruence relations on a group.
200+
-/
201+
@[to_additive (attr := simps) AddSubgroup.orderIsoAddCon
202+
"The normal subgroups correspond to the additive congruence relations on an `AddGroup`."]
203+
def _root_.Subgroup.orderIsoCon :
204+
{ N : Subgroup G // N.Normal } ≃o Con G where
205+
toFun N := letI : N.val.Normal := N.prop; QuotientGroup.con N
206+
invFun c := ⟨c.subgroup, inferInstance⟩
207+
left_inv := fun ⟨N, _⟩ ↦ Subtype.mk_eq_mk.mpr (Con.subgroup_quotientGroupCon N)
208+
right_inv c := QuotientGroup.con_subgroup c
209+
map_rel_iff' := by
210+
simp only [QuotientGroup.con, Equiv.coe_fn_mk, Con.le_def, Con.rel_mk, leftRel_apply]
211+
refine ⟨fun h x _ ↦ ?_, fun hle _ _ h ↦ hle h⟩
212+
specialize @h 1 x
213+
simp_all
214+
215+
@[to_additive (attr := simp)]
216+
lemma con_le_iff {N M : Subgroup G} [N.Normal] [M.Normal] :
217+
QuotientGroup.con N ≤ QuotientGroup.con M ↔ N ≤ M :=
218+
(Subgroup.orderIsoCon.map_rel_iff (a := ⟨N, inferInstance⟩) (b := ⟨M, inferInstance⟩))
219+
220+
@[to_additive (attr := gcongr)]
221+
lemma con_mono {N M : Subgroup G} [hN : N.Normal] [hM : M.Normal] (h : N ≤ M) :
222+
QuotientGroup.con N ≤ QuotientGroup.con M :=
223+
con_le_iff.mpr h
224+
153225
/-- A group homomorphism `φ : G →* M` with `N ⊆ ker(φ)` descends (i.e. `lift`s) to a
154226
group homomorphism `G/N →* M`. -/
155227
@[to_additive "An `AddGroup` homomorphism `φ : G →+ M` with `N ⊆ ker(φ)` descends (i.e. `lift`s)
156228
to a group homomorphism `G/N →* M`."]
157229
def lift (φ : G →* M) (HN : N ≤ φ.ker) : Q →* M :=
158-
(QuotientGroup.con N).lift φ fun x y h => by
159-
simp only [QuotientGroup.con, leftRel_apply, Con.rel_mk] at h
160-
rw [Con.ker_rel]
161-
calc
162-
φ x = φ (y * (x⁻¹ * y)⁻¹) := by rw [mul_inv_rev, inv_inv, mul_inv_cancel_left]
163-
_ = φ y := by rw [φ.map_mul, HN (N.inv_mem h), mul_one]
230+
(QuotientGroup.con N).lift φ <| con_ker_eq_conKer φ ▸ con_mono HN
164231

165232
@[to_additive (attr := simp)]
166233
theorem lift_mk {φ : G →* M} (HN : N ≤ φ.ker) (g : G) : lift N φ HN (g : Q) = φ g :=

0 commit comments

Comments
 (0)