Skip to content

Commit 2b8afdb

Browse files
committed
feat(GroupTheory): IsComplement' transport lemmas
1 parent 4fae409 commit 2b8afdb

2 files changed

Lines changed: 79 additions & 0 deletions

File tree

Mathlib/Algebra/Group/Subgroup/Pointwise.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,13 @@ theorem inf_mul_assoc (A B C : Subgroup G) (h : C ≤ A) :
330330
suffices y * z * z⁻¹ ∈ A by simpa
331331
exact mul_mem hyz (inv_mem (h hz))
332332

333+
/-- **Dedekind's modular law**: `(N ⊔ H) ⊓ K = N ⊔ H ⊓ K` for a normal subgroup `N ≤ K`. -/
334+
@[to_additive /-- **Dedekind's modular law**: `(N ⊔ H) ⊓ K = N ⊔ H ⊓ K` for a normal additive
335+
subgroup `N ≤ K`. -/]
336+
theorem sup_inf_assoc_of_le {N : Subgroup G} [N.Normal] (H : Subgroup G) {K : Subgroup G}
337+
(h : N ≤ K) : (N ⊔ H) ⊓ K = N ⊔ H ⊓ K :=
338+
SetLike.coe_injective <| by rw [coe_inf, normal_mul, normal_mul, mul_inf_assoc _ _ _ h]
339+
333340
@[to_additive]
334341
lemma normalizer_inf_normalizer_le_normalizer_sup (H K : Subgroup G) :
335342
normalizer H ⊓ normalizer K ≤ normalizer ((H ⊔ K : Subgroup G) : Set G) := by

Mathlib/GroupTheory/Complement.lean

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,22 @@ lemma isComplement_iff_existsUnique_mul_inv_mem :
209209
· exact ⟨(⟨_, hx⟩, x), by simp, by aesop⟩
210210
· exact ⟨x.2, by simp [← hx], fun y hy ↦ (Prod.ext_iff.1 <| by simpa using hx' (⟨_, hy⟩, y)).2
211211

212+
@[to_additive]
213+
theorem IsComplement'.subgroupOf {N A U : Subgroup G} (hA : IsComplement' N A) (hAU : A ≤ U) :
214+
IsComplement' (N.subgroupOf U) (A.subgroupOf U) := by
215+
-- The unique factor `a ∈ A` of `u ∈ U` lies in `U`, so it factors `u` inside `U` as well.
216+
refine isComplement_iff_existsUnique_mul_inv_mem.mpr fun u => ?_
217+
obtain ⟨a, ha, hu⟩ := isComplement_iff_existsUnique_mul_inv_mem.mp hA (u : G)
218+
refine ⟨⟨⟨a, hAU a.2⟩, a.2⟩, ha, fun b hb => ?_⟩
219+
simpa [Subtype.ext_iff] using hu ⟨b, b.2⟩ hb
220+
221+
theorem IsComplement'.smul {α : Type*} [Group α] [MulDistribMulAction α G]
222+
(h : IsComplement' H K) (a : α) : IsComplement' (a • H) (a • K) := by
223+
refine isComplement_iff_existsUnique_mul_inv_mem.mpr fun g => ?_
224+
refine ((equivSMul a K).toEquiv.existsUnique_congr fun k => ?_).mp
225+
(isComplement_iff_existsUnique_mul_inv_mem.mp h (a⁻¹ • g))
226+
simp [Set.mem_smul_set_iff_inv_smul_mem]
227+
212228
@[to_additive]
213229
lemma isComplement_subgroup_right_iff_existsUnique_quotientGroupMk :
214230
IsComplement S H ↔ ∀ q : G ⧸ H, ∃! s : S, QuotientGroup.mk s.1 = q := by
@@ -642,6 +658,12 @@ theorem IsComplement'.disjoint (h : IsComplement' H K) : Disjoint H K :=
642658
theorem IsComplement'.index_eq_card (h : IsComplement' H K) : K.index = Nat.card H :=
643659
h.card_left.symm
644660

661+
/-- A complement to a central subgroup is normal. -/
662+
theorem IsComplement'.normal_of_le_center (hc : H.IsComplement' K) (hZ : H ≤ center G) :
663+
K.Normal := by
664+
rw [← normalizer_eq_top_iff, ← top_le_iff, ← hc.sup_eq_top]
665+
exact sup_le (hZ.trans (center_le_normalizer (K : Set G))) K.le_normalizer
666+
645667
#adaptation_note
646668
/-- `respectTransparency.types true` changes the auto-generated lemmas' signature -/
647669
set_option backward.isDefEq.respectTransparency.types false in
@@ -669,6 +691,33 @@ theorem isComplement'_of_disjoint_and_mul_eq_univ (h1 : Disjoint H K)
669691
obtain ⟨h, hh, k, hk, hg⟩ := Set.eq_univ_iff_forall.mp h2 g
670692
exact ⟨(⟨h, hh⟩, ⟨k, hk⟩), hg⟩
671693

694+
theorem _root_.IsCompl.isComplement' [H.Normal] (h : IsCompl H K) : IsComplement' H K :=
695+
isComplement'_of_disjoint_and_mul_eq_univ h.disjoint <| by
696+
rw [← normal_mul, codisjoint_iff.mp h.codisjoint, coe_top]
697+
698+
/-- For `H` normal, being complements in the group sense is equivalent to being lattice
699+
complements. -/
700+
theorem isComplement'_iff_isCompl [H.Normal] : IsComplement' H K ↔ IsCompl H K :=
701+
⟨IsComplement'.isCompl, IsCompl.isComplement'⟩
702+
703+
/-- If `K` is conjugate to `L`, then it is conjugate to `L` by an element of its
704+
complement `H`. -/
705+
theorem IsComplement'.exists_smul_eq_of_conj_smul_eq (h : IsComplement' H K) {L : Subgroup G}
706+
{g : G} (hg : MulAut.conj g • K = L) : ∃ x : H, MulAut.conj (x : G) • K = L := by
707+
obtain ⟨⟨a, b⟩, rfl⟩ := (h.existsUnique g).exists
708+
exact ⟨a, by rw [← hg, map_mul, mul_smul, conj_smul_eq_self_of_mem b.2]⟩
709+
710+
theorem IsComplement'.map {G' : Type*} [Group G'] (h : IsComplement' H K)
711+
{f : G →* G'} (hf : Function.Surjective f) (hker : f.ker ≤ K) :
712+
IsComplement' (H.map f) (K.map f) := by
713+
refine isComplement'_of_disjoint_and_mul_eq_univ ?_ ?_
714+
· rw [disjoint_iff, ← (comap_injective hf).eq_iff, MonoidHom.comap_bot]
715+
calc comap f (H.map f ⊓ K.map f)
716+
= (f.ker ⊔ H) ⊓ K := by rw [comap_inf, comap_map_eq, comap_map_eq_self hker, sup_comm]
717+
_ = f.ker ⊔ H ⊓ K := sup_inf_assoc_of_le H hker
718+
_ = f.ker := by rw [disjoint_iff.mp h.disjoint, sup_bot_eq]
719+
· simp [← Set.image_mul, IsComplement.mul_eq h, hf.range_eq]
720+
672721
theorem isComplement'_of_card_mul_and_disjoint [Finite G]
673722
(h1 : Nat.card H * Nat.card K = Nat.card G) (h2 : Disjoint H K) :
674723
IsComplement' H K :=
@@ -684,6 +733,29 @@ theorem isComplement'_of_coprime [Finite G]
684733
(h2 : Nat.Coprime (Nat.card H) (Nat.card K)) : IsComplement' H K :=
685734
isComplement'_of_card_mul_and_disjoint h1 <| disjoint_of_coprime_natCard h2
686735

736+
/-- A subgroup `H` of order coprime to a normal subgroup `N` is a complement of `N` inside the
737+
join `H ⊔ N`. -/
738+
theorem isComplement'_subgroupOf_sup {N : Subgroup G} [N.Normal]
739+
(h : Nat.Coprime (Nat.card N) (Nat.card H)) :
740+
IsComplement' (N.subgroupOf (H ⊔ N)) (H.subgroupOf (H ⊔ N)) := by
741+
by_cases hN : Nat.card N = 0
742+
· obtain rfl : H = ⊥ := by simpa [hN] using h
743+
simp
744+
by_cases hH : Nat.card H = 0
745+
· obtain rfl : N = ⊥ := by simpa [hH] using h
746+
simp
747+
have hcardN : Nat.card (N.subgroupOf (H ⊔ N)) = Nat.card N :=
748+
Nat.card_congr (subgroupOfEquivOfLe le_sup_right).toEquiv
749+
have hcardH : Nat.card (H.subgroupOf (H ⊔ N)) = Nat.card H :=
750+
Nat.card_congr (subgroupOfEquivOfLe le_sup_left).toEquiv
751+
have hidx : (N.subgroupOf (H ⊔ N)).index = Nat.card H := by
752+
rw [← relIndex, relIndex_sup_right, relIndex,
753+
subgroupOf_eq_bot.mpr (disjoint_of_coprime_natCard h), index_bot]
754+
have hcard : Nat.card ↥(H ⊔ N) = Nat.card N * Nat.card H := by
755+
rw [← (N.subgroupOf (H ⊔ N)).card_mul_index, hidx, hcardN]
756+
have : Finite ↥(H ⊔ N) := Nat.finite_of_card_ne_zero (hcard.trans_ne (mul_ne_zero hN hH))
757+
exact isComplement'_of_coprime (by rw [hcardN, hcardH, hcard]) (by rw [hcardN, hcardH]; exact h)
758+
687759
theorem isComplement'_stabilizer {α : Type*} [MulAction G α] (a : α)
688760
(h1 : ∀ h : H, h • a = a → h = 1) (h2 : ∀ g : G, ∃ h : H, h • g • a = a) :
689761
IsComplement' H (MulAction.stabilizer G a) := by

0 commit comments

Comments
 (0)