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

Commit 096bdb7

Browse files
committed
refactor(group_theory/solvable): move subgroup commutators into new file (#8534)
The theory of nilpotent subgroups also needs a theory of general commutators (if H,K : subgroup G then so is [H,K]), but I don't really want to import solvable groups to get nilpotent groups, so I am breaking the solvable group file into two, splitting off the API for these commutators.
1 parent 292e3fa commit 096bdb7

File tree

2 files changed

+112
-93
lines changed

2 files changed

+112
-93
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/-
2+
Copyright (c) 2021 Jordan Brown, Thomas Browning, Patrick Lutz. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Jordan Brown, Thomas Browning, Patrick Lutz
5+
-/
6+
7+
import data.bracket
8+
import group_theory.subgroup
9+
import tactic.group
10+
11+
/-!
12+
# General commutators.
13+
14+
If `G` is a group and `H₁ H₂ : subgroup G` then the general commutator `⁅H₁, H₂⁆ : subgroup G`
15+
is the subgroup of `G` generated by the commutators `h₁ * h₂ * h₁⁻¹ * h₂⁻¹`.
16+
17+
## Main definitions
18+
19+
* `general_commutator H₁ H₂` : the commutator of the subgroups `H₁` and `H₂`
20+
-/
21+
22+
open subgroup
23+
24+
variables {G G' : Type*} [group G] [group G'] {f : G →* G'}
25+
26+
/-- The commutator of two subgroups `H₁` and `H₂`. -/
27+
instance general_commutator : has_bracket (subgroup G) (subgroup G) :=
28+
⟨λ H₁ H₂, closure {x | ∃ (p ∈ H₁) (q ∈ H₂), p * q * p⁻¹ * q⁻¹ = x}⟩
29+
30+
lemma general_commutator_def (H₁ H₂ : subgroup G) :
31+
⁅H₁, H₂⁆ = closure {x | ∃ (p ∈ H₁) (q ∈ H₂), p * q * p⁻¹ * q⁻¹ = x} := rfl
32+
33+
instance general_commutator_normal (H₁ H₂ : subgroup G) [h₁ : H₁.normal]
34+
[h₂ : H₂.normal] : normal ⁅H₁, H₂⁆ :=
35+
begin
36+
let base : set G := {x | ∃ (p ∈ H₁) (q ∈ H₂), p * q * p⁻¹ * q⁻¹ = x},
37+
suffices h_base : base = group.conjugates_of_set base,
38+
{ dsimp only [general_commutator_def, ←base],
39+
rw h_base,
40+
exact subgroup.normal_closure_normal },
41+
apply set.subset.antisymm group.subset_conjugates_of_set,
42+
intros a h,
43+
simp_rw [group.mem_conjugates_of_set_iff, is_conj_iff] at h,
44+
rcases h with ⟨b, ⟨c, hc, e, he, rfl⟩, d, rfl⟩,
45+
exact ⟨d * c * d⁻¹, h₁.conj_mem c hc d, d * e * d⁻¹, h₂.conj_mem e he d, by group⟩,
46+
end
47+
48+
lemma general_commutator_mono {H₁ H₂ K₁ K₂ : subgroup G} (h₁ : H₁ ≤ K₁) (h₂ : H₂ ≤ K₂) :
49+
⁅H₁, H₂⁆ ≤ ⁅K₁, K₂⁆ :=
50+
begin
51+
apply closure_mono,
52+
rintros x ⟨p, hp, q, hq, rfl⟩,
53+
exact ⟨p, h₁ hp, q, h₂ hq, rfl⟩,
54+
end
55+
56+
lemma general_commutator_def' (H₁ H₂ : subgroup G) [H₁.normal] [H₂.normal] :
57+
⁅H₁, H₂⁆ = normal_closure {x | ∃ (p ∈ H₁) (q ∈ H₂), p * q * p⁻¹ * q⁻¹ = x} :=
58+
by rw [← normal_closure_eq_self ⁅H₁, H₂⁆, general_commutator_def,
59+
normal_closure_closure_eq_normal_closure]
60+
61+
lemma general_commutator_le (H₁ H₂ : subgroup G) (K : subgroup G) :
62+
⁅H₁, H₂⁆ ≤ K ↔ ∀ (p ∈ H₁) (q ∈ H₂), p * q * p⁻¹ * q⁻¹ ∈ K :=
63+
begin
64+
rw [general_commutator, closure_le],
65+
split,
66+
{ intros h p hp q hq,
67+
exact h ⟨p, hp, q, hq, rfl⟩, },
68+
{ rintros h x ⟨p, hp, q, hq, rfl⟩,
69+
exact h p hp q hq, }
70+
end
71+
72+
lemma general_commutator_containment (H₁ H₂ : subgroup G) {p q : G} (hp : p ∈ H₁) (hq : q ∈ H₂) :
73+
p * q * p⁻¹ * q⁻¹ ∈ ⁅H₁, H₂⁆ :=
74+
(general_commutator_le H₁ H₂ ⁅H₁, H₂⁆).mp (le_refl ⁅H₁, H₂⁆) p hp q hq
75+
76+
lemma general_commutator_comm (H₁ H₂ : subgroup G) : ⁅H₁, H₂⁆ = ⁅H₂, H₁⁆ :=
77+
begin
78+
suffices : ∀ H₁ H₂ : subgroup G, ⁅H₁, H₂⁆ ≤ ⁅H₂, H₁⁆, { exact le_antisymm (this _ _) (this _ _) },
79+
intros H₁ H₂,
80+
rw general_commutator_le,
81+
intros p hp q hq,
82+
have h : (p * q * p⁻¹ * q⁻¹)⁻¹ ∈ ⁅H₂, H₁⁆ := subset_closure ⟨q, hq, p, hp, by group⟩,
83+
convert inv_mem ⁅H₂, H₁⁆ h,
84+
group,
85+
end
86+
87+
lemma general_commutator_le_right (H₁ H₂ : subgroup G) [h : normal H₂] :
88+
⁅H₁, H₂⁆ ≤ H₂ :=
89+
begin
90+
rw general_commutator_le,
91+
intros p hp q hq,
92+
exact mul_mem H₂ (h.conj_mem q hq p) (inv_mem H₂ hq),
93+
end
94+
95+
lemma general_commutator_le_left (H₁ H₂ : subgroup G) [h : normal H₁] :
96+
⁅H₁, H₂⁆ ≤ H₁ :=
97+
begin
98+
rw general_commutator_comm,
99+
exact general_commutator_le_right H₂ H₁,
100+
end
101+
102+
@[simp] lemma general_commutator_bot (H : subgroup G) : ⁅H, ⊥⁆ = (⊥ : subgroup G) :=
103+
by { rw eq_bot_iff, exact general_commutator_le_right H ⊥ }
104+
105+
@[simp] lemma bot_general_commutator (H : subgroup G) : ⁅(⊥ : subgroup G), H⁆ = (⊥ : subgroup G) :=
106+
by { rw eq_bot_iff, exact general_commutator_le_left ⊥ H }
107+
108+
lemma general_commutator_le_inf (H₁ H₂ : subgroup G) [normal H₁] [normal H₂] :
109+
⁅H₁, H₂⁆ ≤ H₁ ⊓ H₂ :=
110+
by simp only [general_commutator_le_left, general_commutator_le_right, le_inf_iff, and_self]

src/group_theory/solvable.lean

Lines changed: 2 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Jordan Brown, Thomas Browning, Patrick Lutz
55
-/
66

7-
import data.bracket
87
import data.matrix.notation
98
import group_theory.abelianization
109
import set_theory.cardinal
10+
import group_theory.general_commutator
1111

1212
/-!
1313
# Solvable Groups
@@ -18,106 +18,15 @@ the derived series of a group.
1818
1919
## Main definitions
2020
21-
* `general_commutator H₁ H₂` : the commutator of the subgroups `H₁` and `H₂`
2221
* `derived_series G n` : the `n`th term in the derived series of `G`, defined by iterating
23-
`general_commutator` starting with the top subgroup
22+
`general_commutator` starting with the top subgroup
2423
* `is_solvable G` : the group `G` is solvable
2524
-/
2625

2726
open subgroup
2827

2928
variables {G G' : Type*} [group G] [group G'] {f : G →* G'}
3029

31-
section general_commutator
32-
33-
/-- The commutator of two subgroups `H₁` and `H₂`. -/
34-
instance general_commutator : has_bracket (subgroup G) (subgroup G) :=
35-
⟨λ H₁ H₂, closure {x | ∃ (p ∈ H₁) (q ∈ H₂), p * q * p⁻¹ * q⁻¹ = x}⟩
36-
37-
lemma general_commutator_def (H₁ H₂ : subgroup G) :
38-
⁅H₁, H₂⁆ = closure {x | ∃ (p ∈ H₁) (q ∈ H₂), p * q * p⁻¹ * q⁻¹ = x} := rfl
39-
40-
instance general_commutator_normal (H₁ H₂ : subgroup G) [h₁ : H₁.normal]
41-
[h₂ : H₂.normal] : normal ⁅H₁, H₂⁆ :=
42-
begin
43-
let base : set G := {x | ∃ (p ∈ H₁) (q ∈ H₂), p * q * p⁻¹ * q⁻¹ = x},
44-
suffices h_base : base = group.conjugates_of_set base,
45-
{ dsimp only [general_commutator_def, ←base],
46-
rw h_base,
47-
exact subgroup.normal_closure_normal },
48-
apply set.subset.antisymm group.subset_conjugates_of_set,
49-
intros a h,
50-
simp_rw [group.mem_conjugates_of_set_iff, is_conj_iff] at h,
51-
rcases h with ⟨b, ⟨c, hc, e, he, rfl⟩, d, rfl⟩,
52-
exact ⟨d * c * d⁻¹, h₁.conj_mem c hc d, d * e * d⁻¹, h₂.conj_mem e he d, by group⟩,
53-
end
54-
55-
lemma general_commutator_mono {H₁ H₂ K₁ K₂ : subgroup G} (h₁ : H₁ ≤ K₁) (h₂ : H₂ ≤ K₂) :
56-
⁅H₁, H₂⁆ ≤ ⁅K₁, K₂⁆ :=
57-
begin
58-
apply closure_mono,
59-
rintros x ⟨p, hp, q, hq, rfl⟩,
60-
exact ⟨p, h₁ hp, q, h₂ hq, rfl⟩,
61-
end
62-
63-
lemma general_commutator_def' (H₁ H₂ : subgroup G) [H₁.normal] [H₂.normal] :
64-
⁅H₁, H₂⁆ = normal_closure {x | ∃ (p ∈ H₁) (q ∈ H₂), p * q * p⁻¹ * q⁻¹ = x} :=
65-
by rw [← normal_closure_eq_self ⁅H₁, H₂⁆, general_commutator_def,
66-
normal_closure_closure_eq_normal_closure]
67-
68-
lemma general_commutator_le (H₁ H₂ : subgroup G) (K : subgroup G) :
69-
⁅H₁, H₂⁆ ≤ K ↔ ∀ (p ∈ H₁) (q ∈ H₂), p * q * p⁻¹ * q⁻¹ ∈ K :=
70-
begin
71-
rw [general_commutator, closure_le],
72-
split,
73-
{ intros h p hp q hq,
74-
exact h ⟨p, hp, q, hq, rfl⟩, },
75-
{ rintros h x ⟨p, hp, q, hq, rfl⟩,
76-
exact h p hp q hq, }
77-
end
78-
79-
lemma general_commutator_containment (H₁ H₂ : subgroup G) {p q : G} (hp : p ∈ H₁) (hq : q ∈ H₂) :
80-
p * q * p⁻¹ * q⁻¹ ∈ ⁅H₁, H₂⁆ :=
81-
(general_commutator_le H₁ H₂ ⁅H₁, H₂⁆).mp (le_refl ⁅H₁, H₂⁆) p hp q hq
82-
83-
lemma general_commutator_comm (H₁ H₂ : subgroup G) : ⁅H₁, H₂⁆ = ⁅H₂, H₁⁆ :=
84-
begin
85-
suffices : ∀ H₁ H₂ : subgroup G, ⁅H₁, H₂⁆ ≤ ⁅H₂, H₁⁆, { exact le_antisymm (this _ _) (this _ _) },
86-
intros H₁ H₂,
87-
rw general_commutator_le,
88-
intros p hp q hq,
89-
have h : (p * q * p⁻¹ * q⁻¹)⁻¹ ∈ ⁅H₂, H₁⁆ := subset_closure ⟨q, hq, p, hp, by group⟩,
90-
convert inv_mem ⁅H₂, H₁⁆ h,
91-
group,
92-
end
93-
94-
lemma general_commutator_le_right (H₁ H₂ : subgroup G) [h : normal H₂] :
95-
⁅H₁, H₂⁆ ≤ H₂ :=
96-
begin
97-
rw general_commutator_le,
98-
intros p hp q hq,
99-
exact mul_mem H₂ (h.conj_mem q hq p) (inv_mem H₂ hq),
100-
end
101-
102-
lemma general_commutator_le_left (H₁ H₂ : subgroup G) [h : normal H₁] :
103-
⁅H₁, H₂⁆ ≤ H₁ :=
104-
begin
105-
rw general_commutator_comm,
106-
exact general_commutator_le_right H₂ H₁,
107-
end
108-
109-
@[simp] lemma general_commutator_bot (H : subgroup G) : ⁅H, ⊥⁆ = (⊥ : subgroup G) :=
110-
by { rw eq_bot_iff, exact general_commutator_le_right H ⊥ }
111-
112-
@[simp] lemma bot_general_commutator (H : subgroup G) : ⁅(⊥ : subgroup G), H⁆ = (⊥ : subgroup G) :=
113-
by { rw eq_bot_iff, exact general_commutator_le_left ⊥ H }
114-
115-
lemma general_commutator_le_inf (H₁ H₂ : subgroup G) [normal H₁] [normal H₂] :
116-
⁅H₁, H₂⁆ ≤ H₁ ⊓ H₂ :=
117-
by simp only [general_commutator_le_left, general_commutator_le_right, le_inf_iff, and_self]
118-
119-
end general_commutator
120-
12130
section derived_series
12231

12332
variables (G)

0 commit comments

Comments
 (0)