Skip to content

Commit 66bbabf

Browse files
committed
feat(GroupTheory/Commutator/Basic): ⁅H₁, H₂⁆ is a normal subgroup of H₁ ⊔ H₂ (leanprover-community#39227)
Shows `⁅H₁, H₂⁆ ≤ H₁ ⊔ H₂` and `(⁅H₁, H₂⁆.subgroupOf <| H₁ ⊔ H₂).Normal`, and adds `_ ≤ normalizer _ ↔` lemmas to help.
1 parent a66f298 commit 66bbabf

2 files changed

Lines changed: 85 additions & 6 deletions

File tree

Mathlib/Algebra/Group/Subgroup/Basic.lean

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -337,26 +337,30 @@ theorem mem_normalizer_iff_conj_image_eq {s : Set G} {g : G} :
337337
refine forall_congr' fun h ↦ ?_
338338
simp_rw [mul_inv_eq_iff_eq_mul, ← eq_inv_mul_iff_mul_eq, ← mul_assoc, exists_eq_right, iff_comm]
339339

340-
theorem _root_.AddSubgroup.mem_normalizer_iff_conj_image_eq {G : Type*} [AddGroup G] {s : Set G}
340+
theorem _root_.AddSubgroup.mem_normalizer_iff_addConj_image_eq {G : Type*} [AddGroup G] {s : Set G}
341341
{g : G} : g ∈ AddSubgroup.normalizer s ↔ AddAut.conj g '' s = s := by
342342
simp_rw [AddSubgroup.mem_set_normalizer_iff'', Set.ext_iff, Set.mem_image, AddAut.conj_apply]
343343
refine forall_congr' fun h ↦ ?_
344344
simp_rw [add_neg_eq_iff_eq_add, ← eq_neg_add_iff_add_eq, ← add_assoc, exists_eq_right, iff_comm]
345345

346+
@[deprecated (since := "2026-05-12")]
347+
alias _root_.AddSubgroup.mem_normalizer_iff_conj_image_eq :=
348+
AddSubgroup.mem_normalizer_iff_addConj_image_eq
349+
346350
theorem normalizer_le_normalizer_closure (s : Set G) : normalizer s ≤ normalizer (closure s) := by
347351
intro g hg
348352
have : MulAut.conj g '' (closure s) = closure (MulAut.conj g '' s) :=
349-
congr(SetLike.coe $(MulAut.conj g |>.toMonoidHom.map_closure s))
353+
congr($(MulAut.conj g |>.toMonoidHom.map_closure s))
350354
rw [mem_normalizer_iff_conj_image_eq.mp hg] at this
351355
rwa [mem_normalizer_iff_conj_image_eq]
352356

353357
theorem _root_.AddSubgroup.normalizer_le_normalizer_closure {G : Type*} [AddGroup G] (s : Set G) :
354358
AddSubgroup.normalizer s ≤ AddSubgroup.normalizer (AddSubgroup.closure s) := by
355359
intro g hg
356360
have : AddAut.conj g '' (AddSubgroup.closure s) = AddSubgroup.closure (AddAut.conj g '' s) :=
357-
congr(SetLike.coe $(AddAut.conj g |>.toAddMonoidHom.map_closure s))
358-
rw [AddSubgroup.mem_normalizer_iff_conj_image_eq.mp hg] at this
359-
rwa [AddSubgroup.mem_normalizer_iff_conj_image_eq]
361+
congr($(AddAut.conj g |>.toAddMonoidHom.map_closure s))
362+
rw [AddSubgroup.mem_normalizer_iff_addConj_image_eq.mp hg] at this
363+
rwa [AddSubgroup.mem_normalizer_iff_addConj_image_eq]
360364

361365
variable {H}
362366

@@ -371,6 +375,39 @@ variable (H) in
371375
theorem normalizer_eq_top [h : H.Normal] : normalizer (H : Set G) = ⊤ :=
372376
normalizer_eq_top_iff.mpr h
373377

378+
@[to_additive]
379+
theorem le_set_normalizer_iff {s : Set G} :
380+
H ≤ normalizer s ↔ ∀ h ∈ H, ∀ g ∈ s, h * g * h⁻¹ ∈ s := by
381+
refine ⟨fun hH h hh g hg ↦ hH hh g |>.mp hg, fun hH h hh k ↦ ⟨fun hk ↦ hH h hh k hk, fun hk ↦ ?_⟩⟩
382+
simpa [mul_assoc] using hH h⁻¹ (inv_mem hh) _ hk
383+
384+
@[to_additive]
385+
theorem le_normalizer_iff : H ≤ normalizer K ↔ ∀ h ∈ H, ∀ k ∈ K, h * k * h⁻¹ ∈ K := by
386+
refine ⟨fun hH h hh g hg ↦ hH hh g |>.mp hg, fun hH h hh k ↦ ⟨fun hk ↦ hH h hh k hk, fun hk ↦ ?_⟩⟩
387+
simpa [mul_assoc] using hH h⁻¹ (inv_mem hh) _ hk
388+
389+
theorem le_normalizer_closure_iff {s : Set G} :
390+
H ≤ normalizer (closure s) ↔ ∀ h ∈ H, ∀ g ∈ s, h * g * h⁻¹ ∈ closure s := by
391+
refine ⟨fun hH h hh g hg ↦ hH hh g |>.mp <| mem_closure_of_mem hg, fun hH h hh ↦ ?_⟩
392+
have : MulAut.conj h '' (closure s) = closure (MulAut.conj h '' s) :=
393+
congr($(MulAut.conj h |>.toMonoidHom.map_closure s))
394+
rw [mem_normalizer_iff_conj_image_eq, this]
395+
apply subset_antisymm <| by simpa using hH h hh
396+
rw [SetLike.coe_subset_coe, closure_le, ← this]
397+
exact fun g hg ↦ ⟨_, hH _ (inv_mem hh) g hg, by simp [mul_assoc]⟩
398+
399+
theorem _root_.AddSubgroup.le_normalizer_closure_iff {G : Type*} [AddGroup G] {H : AddSubgroup G}
400+
{s : Set G} :
401+
H ≤ AddSubgroup.normalizer (AddSubgroup.closure s) ↔
402+
∀ h ∈ H, ∀ g ∈ s, h + g + -h ∈ AddSubgroup.closure s := by
403+
refine ⟨fun hH h hh g hg ↦ hH hh g |>.mp <| AddSubgroup.mem_closure_of_mem hg, fun hH h hh ↦ ?_⟩
404+
have : AddAut.conj h '' (AddSubgroup.closure s) = AddSubgroup.closure (AddAut.conj h '' s) :=
405+
congr($(AddAut.conj h |>.toAddMonoidHom.map_closure s))
406+
rw [AddSubgroup.mem_normalizer_iff_addConj_image_eq, this]
407+
apply subset_antisymm <| by simpa using hH h hh
408+
rw [SetLike.coe_subset_coe, AddSubgroup.closure_le, ← this]
409+
exact fun g hg ↦ ⟨_, hH _ (neg_mem hh) g hg, by simp [add_assoc]⟩
410+
374411
variable {N : Type*} [Group N]
375412

376413
/-- The preimage of the normalizer is contained in the normalizer of the preimage. -/

Mathlib/GroupTheory/Commutator/Basic.lean

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ theorem map_commutatorElement : (f ⁅g₁, g₂⁆ : G') = ⁅f g₁, f g₂⁆
7070
theorem conjugate_commutatorElement : g₃ * ⁅g₁, g₂⁆ * g₃⁻¹ = ⁅g₃ * g₁ * g₃⁻¹, g₃ * g₂ * g₃⁻¹⁆ := by
7171
simp [mul_assoc, commutatorElement_def]
7272

73+
@[to_additive]
74+
theorem commutatorElement_mul_left_eq_conj_mul (a b c : G) :
75+
⁅a * b, c⁆ = a * ⁅b, c⁆ * a⁻¹ * ⁅a, c⁆ := by
76+
simp [mul_assoc, commutatorElement_def]
77+
78+
@[to_additive]
79+
theorem commutatorElement_mul_right_eq_mul_conj (a b c : G) :
80+
⁅a, b * c⁆ = ⁅a, b⁆ * b * ⁅a, c⁆ * b⁻¹ := by
81+
simp [mul_assoc, commutatorElement_def]
82+
7383
namespace Subgroup
7484

7585
/-- The commutator of two subgroups `H₁` and `H₂`. -/
@@ -82,7 +92,7 @@ theorem commutator_def (H₁ H₂ : Subgroup G) :
8292
⁅H₁, H₂⁆ = closure { g | ∃ g₁ ∈ H₁, ∃ g₂ ∈ H₂, ⁅g₁, g₂⁆ = g } :=
8393
rfl
8494

85-
variable {g₁ g₂ g₃} {H H₁ H₂ H₃ K₁ K₂ : Subgroup G}
95+
variable {g₁ g₂ g₃} {H H₁ H₂ H₃ K K₁ K₂ : Subgroup G}
8696

8797
@[to_additive]
8898
theorem commutator_mem_commutator (h₁ : g₁ ∈ H₁) (h₂ : g₂ ∈ H₂) : ⁅g₁, g₂⁆ ∈ ⁅H₁, H₂⁆ :=
@@ -165,6 +175,16 @@ theorem commutator_top_left_le_iff : ⁅(⊤ : Subgroup G), H⁆ ≤ H ↔ H.Nor
165175
theorem commutator_top_right_le_iff : ⁅H, ⊤⁆ ≤ H ↔ H.Normal :=
166176
commutator_comm H ⊤ ▸ commutator_top_left_le_iff
167177

178+
@[to_additive]
179+
theorem le_normalizer_iff_commutator_le_right : H ≤ normalizer K ↔ ⁅H, K⁆ ≤ K := by
180+
refine le_normalizer_iff.trans ⟨fun hH ↦ ?_, fun hH h hh k hk ↦ ?_⟩
181+
· exact commutator_le.mpr fun h hh k hk ↦ mul_mem (hH h hh k hk) (inv_mem hk)
182+
· exact (mul_mem_cancel_right <| inv_mem hk).mp <| hH <| commutator_mem_commutator hh hk
183+
184+
@[to_additive]
185+
theorem le_normalizer_iff_commutator_le_left : H ≤ normalizer K ↔ ⁅K, H⁆ ≤ K :=
186+
commutator_comm H K ▸ le_normalizer_iff_commutator_le_right
187+
168188
@[to_additive (attr := simp)]
169189
theorem commutator_bot_left : ⁅(⊥ : Subgroup G), H₁⁆ = ⊥ :=
170190
le_bot_iff.mp (commutator_le_left ⊥ H₁)
@@ -179,6 +199,28 @@ theorem commutator_le_inf [Normal H₁] [Normal H₂] : ⁅H₁, H₂⁆ ≤ H
179199

180200
end Normal
181201

202+
@[to_additive]
203+
theorem commutator_le_sup : ⁅H₁, H₂⁆ ≤ H₁ ⊔ H₂ :=
204+
commutator_le.mpr <| by grind [mul_assoc, mul_mem, mul_mem_sup, inv_mem]
205+
206+
@[to_additive]
207+
theorem normalizer_commutator_ge_left : H₁ ≤ normalizer (⁅H₁, H₂⁆ : Subgroup G) := by
208+
apply le_normalizer_closure_iff.mpr
209+
rintro g hg _ ⟨g₁, hg₁, g₂, hg₂, rfl⟩
210+
apply (mul_mem_cancel_right <| commutator_mem_commutator hg hg₂).mp
211+
rw [← commutatorElement_mul_left_eq_conj_mul g g₁ g₂]
212+
exact commutator_mem_commutator (mul_mem hg hg₁) hg₂
213+
214+
@[to_additive]
215+
theorem normalizer_commutator_ge_right : H₂ ≤ normalizer (⁅H₁, H₂⁆ : Subgroup G) := by
216+
rw [commutator_comm]
217+
apply normalizer_commutator_ge_left
218+
219+
@[to_additive]
220+
instance normal_subgroupOf_commutator_sup : (⁅H₁, H₂⁆.subgroupOf <| H₁ ⊔ H₂).Normal :=
221+
normal_subgroupOf_of_le_normalizer <| sup_le
222+
(normalizer_commutator_ge_left H₁ H₂) (normalizer_commutator_ge_right H₁ H₂)
223+
182224
@[to_additive]
183225
theorem map_commutator (f : G →* G') : map f ⁅H₁, H₂⁆ = ⁅map f H₁, map f H₂⁆ := by
184226
simp_rw [le_antisymm_iff, map_le_iff_le_comap, commutator_le, mem_comap, map_commutatorElement]

0 commit comments

Comments
 (0)