Skip to content

Commit 05f71fa

Browse files
AntoineChambert-Loirleanprover-community-mathlib4-botjcommelin
committed
feat(GroupTheory/Perm/Centralizer): study the centralizer of a permutation (#17522)
This is the core of the work on the centralizer of a permutation. It is the sequel of several PR which lay out basic useful results. Let `α : Type` with `Fintype α` (and `DecidableEq α`). The main goal of this file is to compute the cardinality of conjugacy classes in `Equiv.Perm α`. Every `g : Equiv.Perm α` has a `cycleType α : Multiset ℕ`. By `Equiv.Perm.isConj_iff_cycleType_eq`, two permutations are conjugate in `Equiv.Perm α` iff their cycle types are equal. To compute the cardinality of the conjugacy classes, we could use a purely combinatorial approach and compute the number of permutations with given cycle type but we resorted to a more algebraic approach. A subsequent PR #17047 treats the case of the alternating group. Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Johan Commelin <johan@commelin.net>
1 parent a8021cc commit 05f71fa

File tree

9 files changed

+847
-16
lines changed

9 files changed

+847
-16
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3362,6 +3362,7 @@ import Mathlib.GroupTheory.OreLocalization.Cardinality
33623362
import Mathlib.GroupTheory.OreLocalization.OreSet
33633363
import Mathlib.GroupTheory.PGroup
33643364
import Mathlib.GroupTheory.Perm.Basic
3365+
import Mathlib.GroupTheory.Perm.Centralizer
33653366
import Mathlib.GroupTheory.Perm.Closure
33663367
import Mathlib.GroupTheory.Perm.ClosureSwap
33673368
import Mathlib.GroupTheory.Perm.ConjAct

Mathlib/Algebra/Group/Subgroup/Finite.lean

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,18 @@ theorem card_le_card_group [Finite G] : Nat.card H ≤ Nat.card G :=
151151
theorem card_le_of_le {H K : Subgroup G} [Finite K] (h : H ≤ K) : Nat.card H ≤ Nat.card K :=
152152
Nat.card_le_card_of_injective _ (Subgroup.inclusion_injective h)
153153

154+
@[to_additive]
155+
theorem card_map_of_injective {H : Type*} [Group H] {K : Subgroup G} {f : G →* H}
156+
(hf : Function.Injective f) :
157+
Nat.card (map f K) = Nat.card K := by
158+
-- simp only [← SetLike.coe_sort_coe]
159+
apply Nat.card_image_of_injective hf
160+
161+
@[to_additive]
162+
theorem card_subtype (K : Subgroup G) (L : Subgroup K) :
163+
Nat.card (map K.subtype L) = Nat.card L :=
164+
card_map_of_injective K.subtype_injective
165+
154166
end Subgroup
155167

156168
namespace Subgroup
@@ -275,4 +287,14 @@ Note: this instance can form a diamond with `Subtype.fintype` or `Subgroup.finty
275287
instance fintypeRange [Fintype G] [DecidableEq N] (f : G →* N) : Fintype (range f) :=
276288
Set.fintypeRange f
277289

290+
lemma _root_.Fintype.card_coeSort_mrange {M N : Type*} [Monoid M] [Monoid N] [Fintype M]
291+
[DecidableEq N] {f : M →* N} (hf : Function.Injective f) :
292+
Fintype.card (mrange f) = Fintype.card M :=
293+
Set.card_range_of_injective hf
294+
295+
lemma _root_.Fintype.card_coeSort_range [Fintype G] [DecidableEq N] {f : G →* N}
296+
(hf : Function.Injective f) :
297+
Fintype.card (range f) = Fintype.card G :=
298+
Set.card_range_of_injective hf
299+
278300
end MonoidHom

Mathlib/GroupTheory/NoncommCoprod.lean

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ Authors: Antoine Chambert-Loir
55
-/
66
import Mathlib.Algebra.Group.Commute.Hom
77
import Mathlib.Algebra.Group.Prod
8+
import Mathlib.Algebra.Group.Subgroup.Ker
9+
import Mathlib.Algebra.Group.Subgroup.Lattice
10+
import Mathlib.Order.Disjoint
811

912
/-!
1013
# Canonical homomorphism from a pair of monoids
@@ -53,7 +56,6 @@ theorem noncommCoprod_apply' (comm) (mn : M × N) :
5356
(f.noncommCoprod g comm) mn = g mn.2 * f mn.1 := by
5457
rw [← comm, noncommCoprod_apply]
5558

56-
5759
@[to_additive]
5860
theorem comp_noncommCoprod {Q : Type*} [Semigroup Q] (h : P →ₙ* Q)
5961
(comm : ∀ m n, Commute (f m) (g n)) :
@@ -114,4 +116,38 @@ theorem comp_noncommCoprod {Q : Type*} [Monoid Q] (h : P →* Q) :
114116
(h.comp f).noncommCoprod (h.comp g) (fun m n ↦ (comm m n).map h) :=
115117
ext fun x => by simp
116118

119+
section group
120+
121+
open Subgroup
122+
123+
lemma noncommCoprod_injective {M N P : Type*} [Group M] [Group N] [Group P]
124+
(f : M →* P) (g : N →* P) (comm : ∀ (m : M) (n : N), Commute (f m) (g n)) :
125+
Function.Injective (noncommCoprod f g comm) ↔
126+
(Function.Injective f ∧ Function.Injective g ∧ _root_.Disjoint f.range g.range) := by
127+
simp only [injective_iff_map_eq_one, disjoint_iff_inf_le,
128+
noncommCoprod_apply, Prod.forall, Prod.mk_eq_one]
129+
refine ⟨fun h ↦ ⟨fun x ↦ ?_, fun x ↦ ?_, ?_⟩, ?_⟩
130+
· simpa using h x 1
131+
· simpa using h 1 x
132+
· intro x ⟨⟨y, hy⟩, z, hz⟩
133+
rwa [(h y z⁻¹ (by rw [map_inv, hy, hz, mul_inv_cancel])).1, map_one, eq_comm] at hy
134+
· intro ⟨hf, hg, hp⟩ a b h
135+
have key := hp ⟨⟨a⁻¹, by rwa [map_inv, inv_eq_iff_mul_eq_one]⟩, b, rfl⟩
136+
exact ⟨hf a (by rwa [key, mul_one] at h), hg b key⟩
137+
138+
lemma noncommCoprod_range {M N P : Type*} [Group M] [Group N] [Group P]
139+
(f : M →* P) (g : N →* P) (comm : ∀ (m : M) (n : N), Commute (f m) (g n)) :
140+
(noncommCoprod f g comm).range = f.range ⊔ g.range := by
141+
apply le_antisymm
142+
· rintro - ⟨a, rfl⟩
143+
exact mul_mem (mem_sup_left ⟨a.1, rfl⟩) (mem_sup_right ⟨a.2, rfl⟩)
144+
· rw [sup_le_iff]
145+
constructor
146+
· rintro - ⟨a, rfl⟩
147+
exact ⟨(a, 1), by rw [noncommCoprod_apply, map_one, mul_one]⟩
148+
· rintro - ⟨a, rfl⟩
149+
exact ⟨(1, a), by rw [noncommCoprod_apply, map_one, one_mul]⟩
150+
151+
end group
152+
117153
end MonoidHom

Mathlib/GroupTheory/Perm/Basic.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,13 @@ theorem mem_iff_ofSubtype_apply_mem (f : Perm (Subtype p)) (x : α) :
399399
simpa only [h, true_iff, MonoidHom.coe_mk, ofSubtype_apply_of_mem f h] using (f ⟨x, h⟩).2
400400
else by simp [h, ofSubtype_apply_of_not_mem f h]
401401

402+
theorem ofSubtype_injective : Function.Injective (ofSubtype : Perm (Subtype p) → Perm α) := by
403+
intro x y h
404+
rw [Perm.ext_iff] at h ⊢
405+
intro a
406+
specialize h a
407+
rwa [ofSubtype_apply_coe, ofSubtype_apply_coe, SetCoe.ext_iff] at h
408+
402409
@[simp]
403410
theorem subtypePerm_ofSubtype (f : Perm (Subtype p)) :
404411
subtypePerm (ofSubtype f) (mem_iff_ofSubtype_apply_mem f) = f :=

0 commit comments

Comments
 (0)