forked from leanprover-community/mathlib4
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIsPerfect.lean
More file actions
106 lines (76 loc) · 3.63 KB
/
IsPerfect.lean
File metadata and controls
106 lines (76 loc) · 3.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/-
Copyright (c) 2026 Damiano Testa. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Inna Capdeboscq, Damiano Testa
-/
module
public import Mathlib.GroupTheory.Nilpotent
/-!
# Perfect groups
A group `G` is perfect if it equals its commutator subgroup, that is `⁅G, G⁆ = G`.
Among the basic results, we show that
* a nontrivial perfect group is not solvable (`IsPerfect.not_isSolvable`);
* an abelian perfect group is trivial (`IsPerfect.subsingleton_of_isMulCommutative`).
## Main Definition
* `Group.IsPerfect`: a group `G` is *perfect* if it equals its own commutator,
that is `⁅⊤, ⊤⁆ = ⊤`, where `⊤` is the full subgroup `G`.
## Main Theorems
* `IsPerfect.map`: The image of a perfect group under a monoid homomorphism is perfect.
* `IsPerfect.instQuotientSubgroup`: The quotient of a perfect group by a normal subgroup is perfect.
* `IsPerfect.ofSurjective`: The image of a perfect group under a surjective monoid
homomorphism is perfect.
-/
@[expose] public section
namespace Group
open Subgroup
variable {G G' : Type*} [Group G] [Group G'] {H K : Subgroup G} (f : G →* G')
variable (G) in
/-- A group `G` is perfect if `G` equals its commutator subgroup `⁅G, G⁆`. -/
class IsPerfect where
/-- The commutator of the group `G` with itself is the whole group `G`. -/
commutator_eq_top : commutator G = (⊤ : Subgroup G)
attribute [simp] IsPerfect.commutator_eq_top
lemma isPerfect_def : IsPerfect G ↔ commutator G = ⊤ :=
⟨fun h ↦ h.commutator_eq_top, fun h ↦ ⟨h⟩⟩
lemma _root_.Subgroup.isPerfect_iff : IsPerfect H ↔ ⁅H, H⁆ = H := by
rw [Group.isPerfect_def, ← (map_injective H.subtype_injective).eq_iff,
map_subtype_commutator, ← MonoidHom.range_eq_map, range_subtype]
lemma _root_.Subgroup.commutator_eq_self [hH : IsPerfect H] : ⁅H, H⁆ = H :=
isPerfect_iff.mp hH
namespace IsPerfect
lemma mem_commutator [hP : IsPerfect G] {g : G} : g ∈ commutator G := by
simp
/-- The trivial group is perfect. -/
instance [Subsingleton G] : IsPerfect G where
commutator_eq_top := Subsingleton.elim _ _
theorem top_iff : IsPerfect (⊤ : Subgroup G) ↔ IsPerfect G := by
rw [isPerfect_def, isPerfect_def, ← (map_injective (⊤ : Subgroup G).subtype_injective).eq_iff,
map_subtype_commutator, ← MonoidHom.range_eq_map, subtype_range, commutator_def]
instance [IsPerfect G] : IsPerfect (⊤ : Subgroup G) :=
top_iff.mpr inferInstance
variable (G) in
lemma not_isSolvable [Nontrivial G] [IsPerfect G] : ¬ IsSolvable G := by
intro h
exact (h.commutator_lt_top_of_nontrivial G).ne commutator_eq_top
variable (G) in
lemma not_isNilpotent [Nontrivial G] [IsPerfect G] : ¬ IsNilpotent G :=
fun _ ↦ (not_isSolvable G) IsNilpotent.to_isSolvable
variable (G) in
lemma not_isMulCommutative [Nontrivial G] [IsPerfect G] : ¬ IsMulCommutative G :=
fun _ ↦ (not_isSolvable G) CommGroup.isSolvable
instance subsingleton_of_isMulCommutative
[hG : IsPerfect G] [h_comm : IsMulCommutative G] : Subsingleton G := by
by_contra! h_not_subsingleton
exact not_isMulCommutative G h_comm
protected lemma map [IsPerfect H] : IsPerfect (H.map f) := by
rw [isPerfect_iff, ← map_commutator, commutator_eq_self]
protected lemma range [IsPerfect G] : IsPerfect f.range := by
rw [MonoidHom.range_eq_map]
exact IsPerfect.map _
variable {f} in
lemma ofSurjective [IsPerfect G] (hf : Function.Surjective f) : IsPerfect G' := by
rw [← top_iff, ← MonoidHom.range_eq_top_of_surjective f hf]
exact IsPerfect.range f
instance instQuotientSubgroup [H.Normal] [IsPerfect G] : IsPerfect (G ⧸ H) :=
ofSurjective (QuotientGroup.mk'_surjective H)
end Group.IsPerfect