Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 87bc893

Browse files
committed
feat(group_theory/{subgroup, order_of_element}): refactors simple groups, classifies finite simple abelian/solvable groups (#6926)
Refactors the deprecated `simple_group` to a new `is_simple_group` Shows that all cyclic groups of prime order are simple Shows that all simple `comm_group`s are cyclic Shows that all simple finite `comm_group`s have prime order Shows that a simple group is solvable iff it is commutative
1 parent ad4aca0 commit 87bc893

File tree

4 files changed

+175
-52
lines changed

4 files changed

+175
-52
lines changed

src/deprecated/subgroup.lean

Lines changed: 1 addition & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -659,54 +659,7 @@ theorem normal_closure_mono {s t : set G} : s ⊆ t → normal_closure s ⊆ nor
659659

660660
end group
661661

662-
section simple_group
663-
664-
class simple_group (G : Type*) [group G] : Prop :=
665-
(simple : ∀ (N : set G) [normal_subgroup N], N = is_subgroup.trivial G ∨ N = set.univ)
666-
667-
class simple_add_group (A : Type*) [add_group A] : Prop :=
668-
(simple : ∀ (N : set A) [normal_add_subgroup N], N = is_add_subgroup.trivial A ∨ N = set.univ)
669-
670-
attribute [to_additive] simple_group
671-
672-
theorem additive.simple_add_group_iff [group G] :
673-
simple_add_group (additive G) ↔ simple_group G :=
674-
⟨λ hs, ⟨λ N h, @simple_add_group.simple _ _ hs _ (by exactI additive.normal_add_subgroup_iff.2 h)⟩,
675-
λ hs, ⟨λ N h, @simple_group.simple _ _ hs _ (by exactI additive.normal_add_subgroup_iff.1 h)⟩⟩
676-
677-
instance additive.simple_add_group [group G] [simple_group G] :
678-
simple_add_group (additive G) := additive.simple_add_group_iff.2 (by apply_instance)
679-
680-
theorem multiplicative.simple_group_iff [add_group A] :
681-
simple_group (multiplicative A) ↔ simple_add_group A :=
682-
⟨λ hs, ⟨λ N h, @simple_group.simple _ _ hs _ (by exactI multiplicative.normal_subgroup_iff.2 h)⟩,
683-
λ hs, ⟨λ N h,
684-
@simple_add_group.simple _ _ hs _ (by exactI multiplicative.normal_subgroup_iff.1 h)⟩⟩
685-
686-
instance multiplicative.simple_group [add_group A] [simple_add_group A] :
687-
simple_group (multiplicative A) := multiplicative.simple_group_iff.2 (by apply_instance)
688-
689-
@[to_additive]
690-
lemma simple_group_of_surjective [group G] [group H] [simple_group G] (f : G → H)
691-
[is_group_hom f] (hf : function.surjective f) : simple_group H :=
692-
⟨λ H iH, have normal_subgroup (f ⁻¹' H), by resetI; apply_instance,
693-
begin
694-
resetI,
695-
cases simple_group.simple (f ⁻¹' H) with h h,
696-
{ refine or.inl (is_subgroup.eq_trivial_iff.2 (λ x hx, _)),
697-
cases hf x with y hy,
698-
rw ← hy at hx,
699-
rw [← hy, is_subgroup.eq_trivial_iff.1 h y hx, is_group_hom.map_one f] },
700-
{ refine or.inr (set.eq_univ_of_forall (λ x, _)),
701-
cases hf x with y hy,
702-
rw set.eq_univ_iff_forall at h,
703-
rw ← hy,
704-
exact h y }
705-
end
706-
707-
end simple_group
708-
709-
/-- Create a bundled subgroup from a set `s` and `[is_subroup s]`. -/
662+
/-- Create a bundled subgroup from a set `s` and `[is_subgroup s]`. -/
710663
@[to_additive "Create a bundled additive subgroup from a set `s` and `[is_add_subgroup s]`."]
711664
def subgroup.of [group G] (s : set G) [h : is_subgroup s] : subgroup G :=
712665
{ carrier := s,

src/group_theory/order_of_element.lean

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ This file defines the order of an element of a finite group. For a finite group
2323
2424
## Main statements
2525
26-
`is_cyclic_of_prime_card` proves that a finite group of prime order is cyclic.
26+
* `is_cyclic_of_prime_card` proves that a finite group of prime order is cyclic.
27+
* `is_simple_group_of_prime_card`, `is_simple_group.is_cyclic`,
28+
and `is_simple_group.prime_card` classify finite simple abelian groups.
2729
2830
## Implementation details
2931
@@ -539,6 +541,10 @@ open subgroup
539541
class is_cyclic (α : Type u) [group α] : Prop :=
540542
(exists_generator [] : ∃ g : α, ∀ x, x ∈ gpowers g)
541543

544+
@[priority 100]
545+
instance is_cyclic_of_subsingleton [group α] [subsingleton α] : is_cyclic α :=
546+
⟨⟨1, λ x, by { rw subsingleton.elim x 1, exact mem_gpowers 1 }⟩⟩
547+
542548
/-- A cyclic group is always commutative. This is not an `instance` because often we have a better
543549
proof of `comm_group`. -/
544550
def is_cyclic.comm_group [hg : group α] [is_cyclic α] : comm_group α :=
@@ -826,4 +832,81 @@ begin
826832
apply card_order_of_eq_totient_aux₂ (λ n, is_cyclic.card_pow_eq_one_le) hd
827833
end
828834

835+
/-- A finite group of prime order is simple. -/
836+
lemma is_simple_group_of_prime_card {α : Type u} [group α] [fintype α] {p : ℕ} [hp : fact p.prime]
837+
(h : fintype.card α = p) : is_simple_group α :=
838+
begin
839+
have h' := nat.prime.one_lt (fact.out p.prime),
840+
rw ← h at h',
841+
haveI := fintype.one_lt_card_iff_nontrivial.1 h',
842+
apply exists_pair_ne α,
843+
end, λ H Hn, begin
844+
classical,
845+
have hcard := card_subgroup_dvd_card H,
846+
rw [h, dvd_prime (fact.out p.prime)] at hcard,
847+
refine hcard.imp (λ h1, _) (λ hp, _),
848+
{ haveI := fintype.card_le_one_iff_subsingleton.1 (le_of_eq h1),
849+
apply eq_bot_of_subsingleton },
850+
{ exact eq_top_of_card_eq _ (hp.trans h.symm) }
851+
end
852+
829853
end cyclic
854+
855+
namespace is_simple_group
856+
857+
section comm_group
858+
variables [comm_group α] [is_simple_group α]
859+
860+
@[priority 100]
861+
instance : is_cyclic α :=
862+
begin
863+
cases subsingleton_or_nontrivial α with hi hi; haveI := hi,
864+
{ apply is_cyclic_of_subsingleton },
865+
{ obtain ⟨g, hg⟩ := exists_ne (1 : α),
866+
refine ⟨⟨g, λ x, _⟩⟩,
867+
cases is_simple_lattice.eq_bot_or_eq_top (subgroup.gpowers g) with hb ht,
868+
{ exfalso,
869+
apply hg,
870+
rw [← subgroup.mem_bot, ← hb],
871+
apply subgroup.mem_gpowers },
872+
{ rw ht,
873+
apply subgroup.mem_top } }
874+
end
875+
876+
theorem prime_card [fintype α] : (fintype.card α).prime :=
877+
begin
878+
have h0 : 0 < fintype.card α := fintype.card_pos_iff.2 (by apply_instance),
879+
obtain ⟨g, hg⟩ := is_cyclic.exists_generator α,
880+
refine ⟨fintype.one_lt_card_iff_nontrivial.2 infer_instance, λ n hn, _⟩,
881+
refine (is_simple_lattice.eq_bot_or_eq_top (subgroup.gpowers (g ^ n))).symm.imp _ _,
882+
{ intro h,
883+
have hgo := order_of_pow g,
884+
rw [order_of_eq_card_of_forall_mem_gpowers hg, nat.gcd_eq_right_iff_dvd.1 hn,
885+
order_of_eq_card_of_forall_mem_gpowers, eq_comm,
886+
nat.div_eq_iff_eq_mul_left (nat.pos_of_dvd_of_pos hn h0) hn] at hgo,
887+
{ exact (mul_left_cancel' (ne_of_gt h0) ((mul_one (fintype.card α)).trans hgo)).symm },
888+
{ intro x,
889+
rw h,
890+
exact subgroup.mem_top _ } },
891+
{ intro h,
892+
apply le_antisymm (nat.le_of_dvd h0 hn),
893+
rw ← order_of_eq_card_of_forall_mem_gpowers hg,
894+
apply order_of_le_of_pow_eq_one (nat.pos_of_dvd_of_pos hn h0),
895+
rw [← subgroup.mem_bot, ← h],
896+
exact subgroup.mem_gpowers _ }
897+
end
898+
899+
end comm_group
900+
901+
end is_simple_group
902+
903+
theorem comm_group.is_simple_iff_is_cyclic_and_prime_card [fintype α] [comm_group α] :
904+
is_simple_group α ↔ is_cyclic α ∧ (fintype.card α).prime :=
905+
begin
906+
split,
907+
{ introI h,
908+
exact ⟨is_simple_group.is_cyclic, is_simple_group.prime_card⟩ },
909+
{ rintro ⟨hc, hp⟩,
910+
haveI : fact (fintype.card α).prime := ⟨hp⟩,
911+
exact is_simple_group_of_prime_card rfl }
912+
end

src/group_theory/solvable.lean

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,3 +302,32 @@ solvable_of_ker_le_range (monoid_hom.inl G G') (monoid_hom.snd G G')
302302
(λ x hx, ⟨x.1, prod.ext rfl hx.symm⟩)
303303

304304
end solvable
305+
306+
section is_simple_group
307+
308+
variable [is_simple_group G]
309+
310+
lemma is_simple_group.derived_series_succ {n : ℕ} : derived_series G n.succ = commutator G :=
311+
begin
312+
induction n with n ih,
313+
{ exact derived_series_one _ },
314+
rw [derived_series_succ, ih],
315+
cases (commutator.normal G).eq_bot_or_eq_top with h h; simp [h]
316+
end
317+
318+
lemma is_simple_group.comm_iff_is_solvable :
319+
(∀ a b : G, a * b = b * a) ↔ is_solvable G :=
320+
⟨is_solvable_of_comm, λ ⟨⟨n, hn⟩⟩, begin
321+
cases n,
322+
{ rw derived_series_zero at hn,
323+
intros a b,
324+
refine (mem_bot.1 _).trans (mem_bot.1 _).symm;
325+
{ rw ← hn,
326+
exact mem_top _ } },
327+
{ rw is_simple_group.derived_series_succ at hn,
328+
intros a b,
329+
rw [← mul_inv_eq_one, mul_inv_rev, ← mul_assoc, ← mem_bot, ← hn],
330+
exact subset_normal_closure ⟨a, b, rfl⟩ }
331+
end
332+
333+
end is_simple_group

src/group_theory/subgroup.lean

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Authors: Kexing Ying
66
import group_theory.submonoid
77
import algebra.group.conj
88
import algebra.pointwise
9-
import order.modular_lattice
9+
import order.atoms
1010

1111
/-!
1212
# Subgroups
@@ -70,6 +70,8 @@ Definitions in the file:
7070
* `monoid_hom.eq_locus f g` : given group homomorphisms `f`, `g`, the elements of `G` such that
7171
`f x = g x` form a subgroup of `G`
7272
73+
* `is_simple_group G` : a class indicating that a group has exactly two normal subgroups
74+
7375
## Implementation notes
7476
7577
Subgroup inclusion is denoted `≤` rather than `⊆`, although `∈` is defined as
@@ -162,8 +164,8 @@ attribute [norm_cast] add_subgroup.mem_coe
162164
attribute [norm_cast] add_subgroup.coe_coe
163165

164166
@[to_additive]
165-
instance (K : subgroup G) [d : decidable_pred K.carrier] [fintype G] : fintype K :=
166-
show fintype {g : G // g ∈ K.carrier}, from infer_instance
167+
instance (K : subgroup G) [d : decidable_pred (∈ K)] [fintype G] : fintype K :=
168+
show fintype {g : G // g ∈ K}, from infer_instance
167169

168170
end subgroup
169171

@@ -387,6 +389,13 @@ instance : inhabited (subgroup G) := ⟨⊥⟩
387389
by simp only [subgroup.ext'_iff, coe_bot, set.eq_singleton_iff_unique_mem, mem_coe, H.one_mem,
388390
true_and]
389391

392+
@[to_additive] lemma eq_bot_of_subsingleton [subsingleton H] : H = ⊥ :=
393+
begin
394+
rw subgroup.eq_bot_iff_forall,
395+
intros y hy,
396+
rw [← subgroup.coe_mk H y hy, subsingleton.elim (⟨y, hy⟩ : H) 1, subgroup.coe_one],
397+
end
398+
390399
@[to_additive] lemma eq_top_of_card_eq [fintype H] [fintype G]
391400
(h : fintype.card H = fintype.card G) : H = ⊤ :=
392401
begin
@@ -1454,6 +1463,55 @@ end⟩
14541463

14551464
end subgroup
14561465

1466+
section
1467+
variables (G) (A)
1468+
1469+
/-- A `group` is simple when it has exactly two normal `subgroup`s. -/
1470+
class is_simple_group extends nontrivial G : Prop :=
1471+
(eq_bot_or_eq_top_of_normal : ∀ H : subgroup G, H.normal → H = ⊥ ∨ H = ⊤)
1472+
1473+
/-- An `add_group` is simple when it has exactly two normal `add_subgroup`s. -/
1474+
class is_simple_add_group extends nontrivial A : Prop :=
1475+
(eq_bot_or_eq_top_of_normal : ∀ H : add_subgroup A, H.normal → H = ⊥ ∨ H = ⊤)
1476+
1477+
attribute [to_additive] is_simple_group
1478+
1479+
variables {G} {A}
1480+
1481+
@[to_additive]
1482+
lemma subgroup.normal.eq_bot_or_eq_top [is_simple_group G] {H : subgroup G} (Hn : H.normal) :
1483+
H = ⊥ ∨ H = ⊤ :=
1484+
is_simple_group.eq_bot_or_eq_top_of_normal H Hn
1485+
1486+
namespace is_simple_group
1487+
1488+
@[to_additive]
1489+
instance {C : Type*} [comm_group C] [is_simple_group C] :
1490+
is_simple_lattice (subgroup C) :=
1491+
⟨λ H, H.normal_of_comm.eq_bot_or_eq_top⟩
1492+
1493+
@[to_additive]
1494+
lemma is_simple_group_of_surjective {H : Type*} [group H] [is_simple_group G]
1495+
[nontrivial H] (f : G →* H) (hf : function.surjective f) :
1496+
is_simple_group H :=
1497+
⟨nontrivial.exists_pair_ne, λ H iH, begin
1498+
refine ((iH.comap f).eq_bot_or_eq_top).imp (λ h, _) (λ h, _),
1499+
{ rw subgroup.eq_bot_iff_forall at *,
1500+
simp_rw subgroup.mem_comap at h,
1501+
intros x hx,
1502+
obtain ⟨y, hy⟩ := hf x,
1503+
rw ← hy at hx,
1504+
rw h y hx at hy,
1505+
rw [← hy, f.map_one] },
1506+
{ rw [← top_le_iff, ← subgroup.map_le_iff_le_comap, ← monoid_hom.range_eq_map,
1507+
monoid_hom.range_top_of_surjective f hf, top_le_iff] at h,
1508+
exact h }
1509+
end
1510+
1511+
end is_simple_group
1512+
1513+
end
1514+
14571515
section pointwise
14581516

14591517
namespace subgroup

0 commit comments

Comments
 (0)