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

Commit 910de7e

Browse files
kckennylaujohoelzl
authored andcommitted
refactor(group_theory/coset): left_cosets is now a quotient (#103)
1 parent 479a122 commit 910de7e

File tree

3 files changed

+41
-45
lines changed

3 files changed

+41
-45
lines changed

data/equiv.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,10 @@ def sum_equiv_sigma_bool (α β : Sort*) : (α ⊕ β) ≃ (Σ b: bool, cond b
287287
λ s, by cases s; refl,
288288
λ s, by rcases s with ⟨_|_, _⟩; refl⟩
289289

290+
def equiv_fib {α β : Type*} (f : α → β) :
291+
α ≃ Σ y : β, {x // f x = y} :=
292+
⟨λ x, ⟨f x, x, rfl⟩, λ x, x.2.1, λ x, rfl, λ ⟨y, x, rfl⟩, rfl⟩
293+
290294
end
291295

292296
section

group_theory/coset.lean

Lines changed: 34 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -113,47 +113,41 @@ theorem normal_iff_eq_cosets : normal_subgroup s ↔ ∀ g, g *l s = s *r g :=
113113

114114
end coset_subgroup
115115

116-
def left_cosets [group α] (s : set α) : set (set α) := range (λa, a *l s)
116+
instance left_rel [group α] (s : set α) [is_subgroup s] : setoid α :=
117+
⟨λ x y, x⁻¹ * y ∈ s,
118+
assume x, by simp [is_submonoid.one_mem],
119+
assume x y hxy,
120+
have (x⁻¹ * y)⁻¹ ∈ s, from is_subgroup.inv_mem hxy,
121+
by simpa using this,
122+
assume x y z hxy hyz,
123+
have x⁻¹ * y * (y⁻¹ * z) ∈ s, from is_submonoid.mul_mem hxy hyz,
124+
by simpa [mul_assoc] using this
125+
126+
def left_cosets [group α] (s : set α) [is_subgroup s] : Type* := quotient (left_rel s)
127+
128+
instance left_cosets.inhabited [group α] (s : set α) [is_subgroup s] : inhabited (left_cosets s) := ⟨⟦1⟧⟩
129+
130+
def left_cosets.left_coset [group α] (s : set α) [is_subgroup s] (g : α) : {x | ⟦x⟧ = ⟦g⟧} = left_coset g s :=
131+
set.ext $ λ z, by simp [eq_comm, mem_left_coset_iff]; refl
117132

118133
namespace is_subgroup
119-
open is_submonoid
120-
variable [group α]
121-
122-
lemma subgroup_mem_left_cosets (s : set α) [is_subgroup s] : s ∈ left_cosets s :=
123-
1, by simp⟩
124-
125-
lemma left_cosets_disjoint {s : set α} [is_subgroup s] :
126-
∀{s₁ s₂ : set α}, s₁ ∈ left_cosets s → s₂ ∈ left_cosets s → ∀{a}, a ∈ s₁ → a ∈ s₂ → s₁ = s₂
127-
| _ _ ⟨a₁, rfl⟩ ⟨a₂, rfl⟩ a h₁ h₂ :=
128-
have h₁ : a₁⁻¹ * a ∈ s, by simpa [mem_left_coset_iff] using h₁,
129-
have h₂ : a₂⁻¹ * a ∈ s, by simpa [mem_left_coset_iff] using h₂,
130-
have a₁⁻¹ * a₂ ∈ s, by simpa [mul_assoc] using mul_mem h₁ (inv_mem h₂),
131-
have a₁ *l s = a₁ *l ((a₁⁻¹ * a₂) *l s), by rw [left_coset_mem_left_coset _ this],
132-
by simpa
133-
134-
lemma pairwise_left_cosets_disjoint {s : set α} (hs : is_subgroup s) :
135-
pairwise_on (left_cosets s) disjoint :=
136-
assume s₁ h₁ s₂ h₂ ne, eq_empty_iff_forall_not_mem.mpr $ assume a ⟨ha₁, ha₂⟩,
137-
ne $ left_cosets_disjoint h₁ h₂ ha₁ ha₂
138-
139-
lemma left_cosets_equiv_subgroup {s : set α} (hs : is_subgroup s) :
140-
∀{t : set α}, t ∈ left_cosets s → nonempty (t ≃ s)
141-
| _ ⟨a, rfl⟩ := ⟨(equiv.set.image ((*) a) s injective_mul).symm⟩
142-
143-
lemma Union_left_cosets_eq_univ {s : set α} (hs : is_subgroup s) : ⋃₀ left_cosets s = univ :=
144-
eq_univ_of_forall $ assume a, ⟨(*) a '' s, mem_range_self _, ⟨1, hs.one_mem, mul_one _⟩⟩
145-
146-
lemma group_equiv_left_cosets_times_subgroup {s : set α} (hs : is_subgroup s) :
147-
nonempty (α ≃ (left_cosets s × s)) :=
148-
calc α ≃ (@set.univ α) :
149-
(equiv.set.univ α).symm
150-
... ≃ (⋃t∈left_cosets s, t) :
151-
by rw [←hs.Union_left_cosets_eq_univ]; simp
152-
... ≃ (Σt:left_cosets s, t) :
153-
equiv.set.bUnion_eq_sigma_of_disjoint hs.pairwise_left_cosets_disjoint
154-
... ≃ (Σt:left_cosets s, s) :
155-
equiv.sigma_congr_right $ λ⟨t, ht⟩, classical.choice $ hs.left_cosets_equiv_subgroup ht
156-
... ≃ (left_cosets s × s) :
157-
equiv.sigma_equiv_prod _ _⟩
134+
variables [group α] {s : set α}
135+
136+
def left_coset_equiv_subgroup (g : α) : left_coset g s ≃ s :=
137+
⟨λ x, ⟨g⁻¹ * x.1, (mem_left_coset_iff _).1 x.2⟩,
138+
λ x, ⟨g * x.1, x.1, x.2, rfl⟩,
139+
λ ⟨x, hx⟩, subtype.eq $ by simp,
140+
λ ⟨g, hg⟩, subtype.eq $ by simp⟩
141+
142+
noncomputable def group_equiv_left_cosets_times_subgroup (hs : is_subgroup s) :
143+
α ≃ (left_cosets s × s) :=
144+
calc α ≃ Σ L : left_cosets s, {x // ⟦x⟧ = L} :
145+
equiv.equiv_fib quotient.mk
146+
... ≃ Σ L : left_cosets s, left_coset (quotient.out L) s :
147+
equiv.sigma_congr_right (λ L, by rw ← left_cosets.left_coset; simp)
148+
... ≃ Σ L : left_cosets s, s :
149+
equiv.sigma_congr_right (λ L, left_coset_equiv_subgroup _)
150+
... ≃ (left_cosets s × s) :
151+
equiv.sigma_equiv_prod _ _
158152

159153
end is_subgroup

group_theory/order_of_element.lean

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,19 +124,17 @@ local attribute [instance] classical.prop_decidable
124124

125125
/- TODO: use cardinal theory, introduce `card : set α → ℕ`, or setup decidability for cosets -/
126126
lemma order_of_dvd_card_univ : order_of a ∣ fintype.card α :=
127-
let ⟨equiv⟩ := (gpowers.is_subgroup a).group_equiv_left_cosets_times_subgroup in
128127
have ft_prod : fintype (left_cosets (gpowers a) × (gpowers a)),
129-
from fintype.of_equiv α equiv,
128+
from fintype.of_equiv α (gpowers.is_subgroup a).group_equiv_left_cosets_times_subgroup,
130129
have ft_s : fintype (gpowers a),
131-
from @fintype.fintype_prod_right _ _ _ ft_prod
132-
⟨⟨(gpowers a), @is_subgroup.subgroup_mem_left_cosets α _ _ (gpowers.is_subgroup a)⟩⟩,
130+
from @fintype.fintype_prod_right _ _ _ ft_prod _,
133131
have ft_cosets : fintype (left_cosets (gpowers a)),
134132
from @fintype.fintype_prod_left _ _ _ ft_prod ⟨⟨1, is_submonoid.one_mem (gpowers a)⟩⟩,
135133
have ft : fintype (left_cosets (gpowers a) × (gpowers a)),
136134
from @prod.fintype _ _ ft_cosets ft_s,
137135
have eq₁ : fintype.card α = @fintype.card _ ft_cosets * @fintype.card _ ft_s,
138136
from calc fintype.card α = @fintype.card _ ft_prod :
139-
(@fintype.card_eq _ _ _ ft_prod).2 (gpowers.is_subgroup a).group_equiv_left_cosets_times_subgroup
137+
@fintype.card_congr _ _ _ ft_prod (gpowers.is_subgroup a).group_equiv_left_cosets_times_subgroup
140138
... = @fintype.card _ (@prod.fintype _ _ ft_cosets ft_s) :
141139
congr_arg (@fintype.card _) $ subsingleton.elim _ _
142140
... = @fintype.card _ ft_cosets * @fintype.card _ ft_s :

0 commit comments

Comments
 (0)