/-
Copyright 2026 The Formal Conjectures Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-/
import FormalConjecturesUtilThe $S_3$-conjecture (conjugacy classes of distinct sizes)
W. Zhou, I. Gorshkov,
F. M. Markel,
R. Knörr, W. Lempken, B. Thielcke,
J. Zhang,
Z. Arad, M. Muzychuk, A. Oliver,
A finite group in which distinct conjugacy classes have distinct cardinalities is called an
namespace ConjugacyClassSizes
open ConjClasses
The cardinality of the conjugacy class c.
noncomputable def conjClassCard {G : Type*} [Monoid G] (c : ConjClasses G) : ℕ :=
Nat.card c.carrier
A finite group G satisfies HasDistinctConjClassSizes if the map assigning to each conjugacy class the
cardinality of its carrier is injective, i.e. distinct conjugacy classes have distinct sizes.
Such a group is called an
def HasDistinctConjClassSizes (G : Type*) [Group G] [Fintype G] : Prop :=
Function.Injective (conjClassCard (G := G))
Equivalently, two conjugacy classes with the same cardinality must coincide.
@[category API, AMS 20]
theorem hasDistinctConjClassSizes_iff {G : Type*} [Group G] [Fintype G] :
HasDistinctConjClassSizes G ↔
∀ (a b : ConjClasses G), conjClassCard a = conjClassCard b → a = b := G:Type u_1inst✝¹:Group Ginst✝:Fintype G⊢ HasDistinctConjClassSizes G ↔ ∀ (a b : ConjClasses G), conjClassCard a = conjClassCard b → a = b
All goals completed! 🐙
The trivial group is anti-homogeneous, since it has a single conjugacy class.
@[category test, AMS 20]
theorem hasDistinctConjClassSizes_of_subsingleton {G : Type*} [Group G] [Fintype G]
[Subsingleton G] : HasDistinctConjClassSizes (G := G) := G:Type u_1inst✝²:Group Ginst✝¹:Fintype Ginst✝:Subsingleton G⊢ HasDistinctConjClassSizes G
G:Type u_1inst✝²:Group Ginst✝¹:Fintype Ginst✝:Subsingleton Ghsub:Subsingleton (ConjClasses G) := inferInstanceAs (Subsingleton (Quotient (IsConj.setoid G)))⊢ HasDistinctConjClassSizes G
G:Type u_1inst✝²:Group Ginst✝¹:Fintype Ginst✝:Subsingleton Ghsub:Subsingleton (ConjClasses G) := inferInstanceAs (Subsingleton (Quotient (IsConj.setoid G)))⊢ ∀ (a b : ConjClasses G), conjClassCard a = conjClassCard b → a = b
G:Type u_1inst✝²:Group Ginst✝¹:Fintype Ginst✝:Subsingleton Ghsub:Subsingleton (ConjClasses G) := inferInstanceAs (Subsingleton (Quotient (IsConj.setoid G)))a:ConjClasses Gb:ConjClasses Ga✝:conjClassCard a = conjClassCard b⊢ a = b
All goals completed! 🐙
An anti-homogeneous group has trivial center, since each central element is in its own conjugacy class.
@[category test, AMS 20]
theorem trivial_center_of_hasDistinctConjClassSizes {G : Type*} [Group G] [Fintype G]
(h : HasDistinctConjClassSizes G) : Subgroup.center G = ⊥ := G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes G⊢ Subgroup.center G = ⊥
-- A central element `w` is conjugate only to itself, so its conjugacy class is `{w}`.
have hcard : ∀ w : G, w ∈ Subgroup.center G → conjClassCard (ConjClasses.mk w) = 1 := G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes G⊢ Subgroup.center G = ⊥
intro w G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Gw:Ghw:w ∈ Subgroup.center G⊢ conjClassCard (ConjClasses.mk w) = 1
have hset : ConjClasses.carrier (ConjClasses.mk w) = {w} := G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes G⊢ Subgroup.center G = ⊥
G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Gw:Ghw:w ∈ Subgroup.center Ga:G⊢ a ∈ (ConjClasses.mk w).carrier ↔ a ∈ {w}
G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Gw:Ghw:w ∈ Subgroup.center Ga:G⊢ IsConj a w ↔ a = w
G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Gw:Ghw:w ∈ Subgroup.center Ga:G⊢ IsConj a w → a = wG:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Gw:Ghw:w ∈ Subgroup.center Ga:G⊢ a = w → IsConj a w
G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Gw:Ghw:w ∈ Subgroup.center Ga:G⊢ IsConj a w → a = w G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Gw:Ghw:w ∈ Subgroup.center Ga:Gc:Gˣhc:SemiconjBy (↑c) a w⊢ a = w
G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Gw:Ghw:w ∈ Subgroup.center Ga:Gc:Gˣhc:↑c * a = w * ↑c⊢ a = w
have : c * a = c * w := G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes G⊢ Subgroup.center G = ⊥ G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Gw:Ghw:w ∈ Subgroup.center Ga:Gc:Gˣhc:↑c * a = w * ↑c⊢ w * ↑c = ↑c * w; All goals completed! 🐙
All goals completed! 🐙
G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Gw:Ghw:w ∈ Subgroup.center Ga:G⊢ a = w → IsConj a w G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Ga:Ghw:a ∈ Subgroup.center G⊢ IsConj a a
All goals completed! 🐙
All goals completed! 🐙
-- Hence the class of any central `z` has the same size as the class of `1`, forcing `z = 1`.
G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Ghcard:∀ w ∈ Subgroup.center G, conjClassCard (ConjClasses.mk w) = 1 :=
fun w hw =>
have hset :=
Set.ext fun a =>
Eq.mpr (id (congrArg (fun _a => _a ↔ a ∈ {w}) (propext mem_carrier_iff_mk_eq)))
(Eq.mpr (id (congrArg (fun _a => _a ↔ a ∈ {w}) (propext mk_eq_mk_iff_isConj)))
(Eq.mpr (id (congrArg (fun _a => IsConj a w ↔ _a) (propext Set.mem_singleton_iff)))
{
mp := fun a_1 =>
Exists.casesOn a_1 fun c hc =>
have this :=
Eq.mpr
(id
(congrArg (fun _a => _a = ↑c * w)
(Eq.mp (congrArg (fun _a => _a) (SemiconjBy.eq_1 (↑c) a w)) hc)))
(Eq.symm (Subgroup.mem_center_iff.mp hw ↑c));
mul_left_cancel this,
mpr := fun a_1 =>
Eq.ndrec (motive := fun w => w ∈ Subgroup.center G → IsConj a w) (fun hw => IsConj.refl a) a_1 hw }));
of_eq_true
(Eq.trans
(congrArg (fun x => x = 1)
(Eq.trans (Eq.trans (congrArg (fun x => Nat.card ↑x) hset) Nat.card_eq_fintype_card) Fintype.card_unique))
(eq_self 1))⊢ ∀ x ∈ Subgroup.center G, x = 1
intro z G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Ghcard:∀ w ∈ Subgroup.center G, conjClassCard (ConjClasses.mk w) = 1 :=
fun w hw =>
have hset :=
Set.ext fun a =>
Eq.mpr (id (congrArg (fun _a => _a ↔ a ∈ {w}) (propext mem_carrier_iff_mk_eq)))
(Eq.mpr (id (congrArg (fun _a => _a ↔ a ∈ {w}) (propext mk_eq_mk_iff_isConj)))
(Eq.mpr (id (congrArg (fun _a => IsConj a w ↔ _a) (propext Set.mem_singleton_iff)))
{
mp := fun a_1 =>
Exists.casesOn a_1 fun c hc =>
have this :=
Eq.mpr
(id
(congrArg (fun _a => _a = ↑c * w)
(Eq.mp (congrArg (fun _a => _a) (SemiconjBy.eq_1 (↑c) a w)) hc)))
(Eq.symm (Subgroup.mem_center_iff.mp hw ↑c));
mul_left_cancel this,
mpr := fun a_1 =>
Eq.ndrec (motive := fun w => w ∈ Subgroup.center G → IsConj a w) (fun hw => IsConj.refl a) a_1 hw }));
of_eq_true
(Eq.trans
(congrArg (fun x => x = 1)
(Eq.trans (Eq.trans (congrArg (fun x => Nat.card ↑x) hset) Nat.card_eq_fintype_card) Fintype.card_unique))
(eq_self 1))z:Ghz:z ∈ Subgroup.center G⊢ z = 1
have hz1 : ConjClasses.mk z = ConjClasses.mk 1 := G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes G⊢ Subgroup.center G = ⊥
G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Ghcard:∀ w ∈ Subgroup.center G, conjClassCard (ConjClasses.mk w) = 1 :=
fun w hw =>
have hset :=
Set.ext fun a =>
Eq.mpr (id (congrArg (fun _a => _a ↔ a ∈ {w}) (propext mem_carrier_iff_mk_eq)))
(Eq.mpr (id (congrArg (fun _a => _a ↔ a ∈ {w}) (propext mk_eq_mk_iff_isConj)))
(Eq.mpr (id (congrArg (fun _a => IsConj a w ↔ _a) (propext Set.mem_singleton_iff)))
{
mp := fun a_1 =>
Exists.casesOn a_1 fun c hc =>
have this :=
Eq.mpr
(id
(congrArg (fun _a => _a = ↑c * w)
(Eq.mp (congrArg (fun _a => _a) (SemiconjBy.eq_1 (↑c) a w)) hc)))
(Eq.symm (Subgroup.mem_center_iff.mp hw ↑c));
mul_left_cancel this,
mpr := fun a_1 =>
Eq.ndrec (motive := fun w => w ∈ Subgroup.center G → IsConj a w) (fun hw => IsConj.refl a) a_1 hw }));
of_eq_true
(Eq.trans
(congrArg (fun x => x = 1)
(Eq.trans (Eq.trans (congrArg (fun x => Nat.card ↑x) hset) Nat.card_eq_fintype_card) Fintype.card_unique))
(eq_self 1))z:Ghz:z ∈ Subgroup.center G⊢ conjClassCard (ConjClasses.mk z) = conjClassCard (ConjClasses.mk 1)
All goals completed! 🐙
G:Type u_1inst✝¹:Group Ginst✝:Fintype Gh:HasDistinctConjClassSizes Ghcard:∀ w ∈ Subgroup.center G, conjClassCard (ConjClasses.mk w) = 1 :=
fun w hw =>
have hset :=
Set.ext fun a =>
Eq.mpr (id (congrArg (fun _a => _a ↔ a ∈ {w}) (propext mem_carrier_iff_mk_eq)))
(Eq.mpr (id (congrArg (fun _a => _a ↔ a ∈ {w}) (propext mk_eq_mk_iff_isConj)))
(Eq.mpr (id (congrArg (fun _a => IsConj a w ↔ _a) (propext Set.mem_singleton_iff)))
{
mp := fun a_1 =>
Exists.casesOn a_1 fun c hc =>
have this :=
Eq.mpr
(id
(congrArg (fun _a => _a = ↑c * w)
(Eq.mp (congrArg (fun _a => _a) (SemiconjBy.eq_1 (↑c) a w)) hc)))
(Eq.symm (Subgroup.mem_center_iff.mp hw ↑c));
mul_left_cancel this,
mpr := fun a_1 =>
Eq.ndrec (motive := fun w => w ∈ Subgroup.center G → IsConj a w) (fun hw => IsConj.refl a) a_1 hw }));
of_eq_true
(Eq.trans
(congrArg (fun x => x = 1)
(Eq.trans (Eq.trans (congrArg (fun x => Nat.card ↑x) hset) Nat.card_eq_fintype_card) Fintype.card_unique))
(eq_self 1))z:Ghz:z ∈ Subgroup.center Ghz1:IsConj z 1⊢ z = 1
All goals completed! 🐙
The symmetric group $S_3$ is anti-homogeneous, since its three conjugacy classes have sizes $1$, $2$ and $3$.
@[category test, AMS 20]
theorem hasDistinctConjClassSizes_perm_fin_three :
HasDistinctConjClassSizes (Equiv.Perm (Fin 3)) := ⊢ HasDistinctConjClassSizes (Equiv.Perm (Fin 3))
have key : (conjClassCard (G := Equiv.Perm (Fin 3))) =
fun c => c.carrier.toFinset.card := ⊢ HasDistinctConjClassSizes (Equiv.Perm (Fin 3))
c:ConjClasses (Equiv.Perm (Fin 3))⊢ conjClassCard c = c.carrier.toFinset.card
All goals completed! 🐙
key:conjClassCard = fun c => c.carrier.toFinset.card :=
funext fun c =>
Eq.mpr (id (congrArg (fun _a => _a = c.carrier.toFinset.card) (conjClassCard.eq_1 c)))
(Eq.mpr (id (congrArg (fun _a => _a = c.carrier.toFinset.card) Nat.card_eq_fintype_card))
(Eq.mpr (id (congrArg (fun _a => _a = c.carrier.toFinset.card) (Eq.symm (Set.toFinset_card c.carrier))))
(Eq.refl c.carrier.toFinset.card)))⊢ Function.Injective conjClassCard
key:conjClassCard = fun c => c.carrier.toFinset.card :=
funext fun c =>
Eq.mpr (id (congrArg (fun _a => _a = c.carrier.toFinset.card) (conjClassCard.eq_1 c)))
(Eq.mpr (id (congrArg (fun _a => _a = c.carrier.toFinset.card) Nat.card_eq_fintype_card))
(Eq.mpr (id (congrArg (fun _a => _a = c.carrier.toFinset.card) (Eq.symm (Set.toFinset_card c.carrier))))
(Eq.refl c.carrier.toFinset.card)))⊢ Function.Injective fun c => c.carrier.toFinset.card
All goals completed! 🐙
Markel's $S_3$-conjecture (1973): any nontrivial finite ah-group is isomorphic to $S_3$.
The conjecture is open in general; it is known to be true for solvable groups.
@[category research open, AMS 20]
theorem conjClassSizes_iff_sym_three
(G : Type) [Group G] [Fintype G] [Nontrivial G]
(h : HasDistinctConjClassSizes (G := G)) :
Nonempty (G ≃* Equiv.Perm (Fin 3)) := G:Typeinst✝²:Group Ginst✝¹:Fintype Ginst✝:Nontrivial Gh:HasDistinctConjClassSizes G⊢ Nonempty (G ≃* Equiv.Perm (Fin 3))
All goals completed! 🐙
The $S_3$-conjecture holds for solvable groups: every nontrivial
@[category research solved, AMS 20]
theorem conjClassSizes_iff_sym_three_solvable
(G : Type) [Group G] [Fintype G] [IsSolvable G] [Nontrivial G]
(h : HasDistinctConjClassSizes (G := G)) :
Nonempty (G ≃* Equiv.Perm (Fin 3)) := G:Typeinst✝³:Group Ginst✝²:Fintype Ginst✝¹:IsSolvable Ginst✝:Nontrivial Gh:HasDistinctConjClassSizes G⊢ Nonempty (G ≃* Equiv.Perm (Fin 3))
All goals completed! 🐙
end ConjugacyClassSizes