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

Commit fea2491

Browse files
committed
chore(group_theory): move order_of into its own file; base costes on left_coset
1 parent d2ab199 commit fea2491

File tree

3 files changed

+232
-232
lines changed

3 files changed

+232
-232
lines changed

group_theory/coset.lean

Lines changed: 73 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,49 +4,48 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Mitchell Rowett, Scott Morrison
55
-/
66
import group_theory.subgroup data.set.basic
7+
open set function
78

8-
open set
9+
variable {α : Type*}
910

10-
variable {γ : Type*}
11-
12-
def left_coset [has_mul γ] (a : γ) (s : set γ) : set γ := (λ x, a * x) '' s
13-
def right_coset [has_mul γ] (s : set γ) (a : γ) : set γ := (λ x, x * a) '' s
11+
def left_coset [has_mul α] (a : α) (s : set α) : set α := (λ x, a * x) '' s
12+
def right_coset [has_mul α] (s : set α) (a : α) : set α := (λ x, x * a) '' s
1413

1514
local infix ` *l `:70 := left_coset
1615
local infix ` *r `:70 := right_coset
1716

1817
section coset_mul
19-
variable [has_mul γ]
18+
variable [has_mul α]
2019

21-
lemma mem_left_coset {s : set γ} {x : γ} (a : γ) (hxS : x ∈ s) : a * x ∈ a *l s :=
22-
mem_image_of_mem (λ b : γ, a * b) hxS
20+
lemma mem_left_coset {s : set α} {x : α} (a : α) (hxS : x ∈ s) : a * x ∈ a *l s :=
21+
mem_image_of_mem (λ b : α, a * b) hxS
2322

24-
lemma mem_right_coset {s : set γ} {x : γ} (a : γ) (hxS : x ∈ s) : x * a ∈ s *r a :=
25-
mem_image_of_mem (λ b : γ, b * a) hxS
23+
lemma mem_right_coset {s : set α} {x : α} (a : α) (hxS : x ∈ s) : x * a ∈ s *r a :=
24+
mem_image_of_mem (λ b : α, b * a) hxS
2625

27-
def left_coset_equiv (s : set γ) (a b : γ) := a *l s = b *l s
26+
def left_coset_equiv (s : set α) (a b : α) := a *l s = b *l s
2827

29-
lemma left_coset_equiv_rel (s : set γ) : equivalence (left_coset_equiv s) :=
28+
lemma left_coset_equiv_rel (s : set α) : equivalence (left_coset_equiv s) :=
3029
mk_equivalence (left_coset_equiv s) (λ a, rfl) (λ a b, eq.symm) (λ a b c, eq.trans)
3130

3231
end coset_mul
3332

3433
section coset_semigroup
35-
variable [semigroup γ]
34+
variable [semigroup α]
3635

37-
@[simp] lemma left_coset_assoc (s : set γ) (a b : γ) : a *l (b *l s) = (a * b) *l s :=
36+
@[simp] lemma left_coset_assoc (s : set α) (a b : α) : a *l (b *l s) = (a * b) *l s :=
3837
by simp [left_coset, right_coset, (image_comp _ _ _).symm, function.comp, mul_assoc]
3938

40-
@[simp] lemma right_coset_assoc (s : set γ) (a b : γ) : s *r a *r b = s *r (a * b) :=
39+
@[simp] lemma right_coset_assoc (s : set α) (a b : α) : s *r a *r b = s *r (a * b) :=
4140
by simp [left_coset, right_coset, (image_comp _ _ _).symm, function.comp, mul_assoc]
4241

43-
lemma left_coset_right_coset (s : set γ) (a b : γ) : a *l s *r b = a *l (s *r b) :=
42+
lemma left_coset_right_coset (s : set α) (a b : α) : a *l s *r b = a *l (s *r b) :=
4443
by simp [left_coset, right_coset, (image_comp _ _ _).symm, function.comp, mul_assoc]
4544

4645
end coset_semigroup
4746

4847
section coset_monoid
49-
variables [monoid γ] (s : set γ)
48+
variables [monoid α] (s : set α)
5049

5150
@[simp] lemma one_left_coset : 1 *l s = s :=
5251
set.ext $ by simp [left_coset]
@@ -58,33 +57,33 @@ end coset_monoid
5857

5958
section coset_submonoid
6059
open is_submonoid
61-
variables [monoid γ] (s : set γ) [is_submonoid s]
60+
variables [monoid α] (s : set α) [is_submonoid s]
6261

63-
lemma mem_own_left_coset (a : γ) : a ∈ a *l s :=
62+
lemma mem_own_left_coset (a : α) : a ∈ a *l s :=
6463
suffices a * 1 ∈ a *l s, by simpa,
6564
mem_left_coset a (one_mem s)
6665

67-
lemma mem_own_right_coset (a : γ) : a ∈ s *r a :=
66+
lemma mem_own_right_coset (a : α) : a ∈ s *r a :=
6867
suffices 1 * a ∈ s *r a, by simpa,
6968
mem_right_coset a (one_mem s)
7069

71-
lemma mem_left_coset_left_coset {a : γ} (ha : a *l s = s) : a ∈ s :=
70+
lemma mem_left_coset_left_coset {a : α} (ha : a *l s = s) : a ∈ s :=
7271
by rw [←ha]; exact mem_own_left_coset s a
7372

74-
lemma mem_right_coset_right_coset {a : γ} (ha : s *r a = s) : a ∈ s :=
73+
lemma mem_right_coset_right_coset {a : α} (ha : s *r a = s) : a ∈ s :=
7574
by rw [←ha]; exact mem_own_right_coset s a
7675

7776
end coset_submonoid
7877

7978
section coset_group
80-
variables [group γ] {s : set γ} {x : γ}
79+
variables [group α] {s : set α} {x : α}
8180

82-
lemma mem_left_coset_iff (a : γ) : x ∈ a *l s ↔ a⁻¹ * x ∈ s :=
81+
lemma mem_left_coset_iff (a : α) : x ∈ a *l s ↔ a⁻¹ * x ∈ s :=
8382
iff.intro
8483
(assume ⟨b, hb, eq⟩, by simp [eq.symm, hb])
8584
(assume h, ⟨a⁻¹ * x, h, by simp⟩)
8685

87-
lemma mem_right_coset_iff (a : γ) : x ∈ s *r a ↔ x * a⁻¹ ∈ s :=
86+
lemma mem_right_coset_iff (a : α) : x ∈ s *r a ↔ x * a⁻¹ ∈ s :=
8887
iff.intro
8988
(assume ⟨b, hb, eq⟩, by simp [eq.symm, hb])
9089
(assume h, ⟨x * a⁻¹, h, by simp⟩)
@@ -94,15 +93,15 @@ end coset_group
9493
section coset_subgroup
9594
open is_submonoid
9695
open is_subgroup
97-
variables [group γ] (s : set γ) [is_subgroup s]
96+
variables [group α] (s : set α) [is_subgroup s]
9897

99-
lemma left_coset_mem_left_coset {a : γ} (ha : a ∈ s) : a *l s = s :=
98+
lemma left_coset_mem_left_coset {a : α} (ha : a ∈ s) : a *l s = s :=
10099
set.ext $ by simp [mem_left_coset_iff, mul_mem_cancel_right s (inv_mem ha)]
101100

102-
lemma right_coset_mem_right_coset {a : γ} (ha : a ∈ s) : s *r a = s :=
101+
lemma right_coset_mem_right_coset {a : α} (ha : a ∈ s) : s *r a = s :=
103102
set.ext $ assume b, by simp [mem_right_coset_iff, mul_mem_cancel_left s (inv_mem ha)]
104103

105-
theorem normal_of_eq_cosets [normal_subgroup s] (g : γ) : g *l s = s *r g :=
104+
theorem normal_of_eq_cosets [normal_subgroup s] (g : α) : g *l s = s *r g :=
106105
set.ext $ assume a, by simp [mem_left_coset_iff, mem_right_coset_iff]; rw [mem_norm_comm_iff]
107106

108107
theorem eq_cosets_of_normal (h : ∀ g, g *l s = s *r g) : normal_subgroup s :=
@@ -113,3 +112,48 @@ theorem normal_iff_eq_cosets : normal_subgroup s ↔ ∀ g, g *l s = s *r g :=
113112
⟨@normal_of_eq_cosets _ _ s _, eq_cosets_of_normal s⟩
114113

115114
end coset_subgroup
115+
116+
def left_cosets [group α] (s : set α) : set (set α) := range (λa, a *l s)
117+
118+
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 _ _⟩
158+
159+
end is_subgroup

group_theory/order_of_element.lean

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
/-
2+
Copyright (c) 2018 Johannes Hölzl. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Johannes Hölzl
5+
-/
6+
import group_theory.coset
7+
open set function
8+
9+
variables {α : Type*} {s : set α} {a a₁ a₂ b c: α}
10+
11+
-- TODO this lemma isn't used anywhere in this file, and should be moved elsewhere.
12+
namespace finset
13+
open finset
14+
15+
lemma mem_range_iff_mem_finset_range_of_mod_eq [decidable_eq α] {f : ℤ → α} {a : α} {n : ℕ}
16+
(hn : 0 < n) (h : ∀i, f (i % n) = f i) :
17+
a ∈ set.range f ↔ a ∈ (finset.range n).image (λi, f i) :=
18+
suffices (∃i, f (i % n) = a) ↔ ∃i, i < n ∧ f ↑i = a, by simpa [h],
19+
have hn' : 0 < (n : ℤ), from int.coe_nat_lt.mpr hn,
20+
iff.intro
21+
(assume ⟨i, hi⟩,
22+
have 0 ≤ i % ↑n, from int.mod_nonneg _ (ne_of_gt hn'),
23+
⟨int.to_nat (i % n),
24+
by rw [←int.coe_nat_lt, int.to_nat_of_nonneg this]; exact ⟨int.mod_lt_of_pos i hn', hi⟩⟩)
25+
(assume ⟨i, hi, ha⟩,
26+
⟨i, by rw [int.mod_eq_of_lt (int.coe_zero_le _) (int.coe_nat_lt_coe_nat_of_lt hi), ha]⟩)
27+
28+
end finset
29+
30+
section order_of
31+
variables [group α] [fintype α] [decidable_eq α]
32+
33+
lemma exists_gpow_eq_one (a : α) : ∃i≠0, a ^ (i:ℤ) = 1 :=
34+
have ¬ injective (λi, a ^ i),
35+
from not_injective_int_fintype,
36+
let ⟨i, j, a_eq, ne⟩ := show ∃(i j : ℤ), a ^ i = a ^ j ∧ i ≠ j,
37+
by rw [injective] at this; simpa [classical.not_forall] in
38+
have a ^ (i - j) = 1,
39+
by simp [gpow_add, gpow_neg, a_eq],
40+
⟨i - j, sub_ne_zero.mpr ne, this
41+
42+
lemma exists_pow_eq_one (a : α) : ∃i≠0, a ^ i = 1 :=
43+
let ⟨i, hi, eq⟩ := exists_gpow_eq_one a in
44+
begin
45+
cases i,
46+
{ exact ⟨i, by simp [int.of_nat_eq_coe, *] at *, eq⟩ },
47+
{ exact ⟨i + 1, dec_trivial, inv_eq_one.1 eq⟩ }
48+
end
49+
50+
/-- `order_of a` is the order of the element `a`, i.e. the `n ≥ 1`, s.t. `a ^ n = 1` -/
51+
def order_of (a : α) : ℕ := nat.find (exists_pow_eq_one a)
52+
53+
lemma pow_order_of_eq_one (a : α) : a ^ order_of a = 1 :=
54+
let ⟨h₁, h₂⟩ := nat.find_spec (exists_pow_eq_one a) in h₂
55+
56+
lemma order_of_ne_zero (a : α) : order_of a ≠ 0 :=
57+
let ⟨h₁, h₂⟩ := nat.find_spec (exists_pow_eq_one a) in h₁
58+
59+
private lemma pow_injective_aux {n m : ℕ} (a : α) (h : n ≤ m)
60+
(hn : n < order_of a) (hm : m < order_of a) (eq : a ^ n = a ^ m) : n = m :=
61+
decidable.by_contradiction $ assume ne : n ≠ m,
62+
have h₁ : m - n ≠ 0, by simp [nat.sub_eq_iff_eq_add h, ne.symm],
63+
have h₂ : a ^ (m - n) = 1, by simp [pow_sub _ h, eq],
64+
have le : order_of a ≤ m - n, from nat.find_min' (exists_pow_eq_one a) ⟨h₁, h₂⟩,
65+
have lt : m - n < order_of a,
66+
from (nat.sub_lt_left_iff_lt_add h).mpr $ nat.lt_add_left _ _ _ hm,
67+
lt_irrefl _ (lt_of_le_of_lt le lt)
68+
69+
lemma pow_injective_of_lt_order_of {n m : ℕ} (a : α)
70+
(hn : n < order_of a) (hm : m < order_of a) (eq : a ^ n = a ^ m) : n = m :=
71+
(le_total n m).elim
72+
(assume h, pow_injective_aux a h hn hm eq)
73+
(assume h, (pow_injective_aux a h hm hn eq.symm).symm)
74+
75+
lemma order_of_le_card_univ : order_of a ≤ fintype.card α :=
76+
finset.card_le_of_inj_on ((^) a)
77+
(assume n _, fintype.complete _)
78+
(assume i j, pow_injective_of_lt_order_of a)
79+
80+
lemma pow_eq_mod_order_of {n : ℕ} : a ^ n = a ^ (n % order_of a) :=
81+
calc a ^ n = a ^ (n % order_of a + order_of a * (n / order_of a)) :
82+
by rw [nat.mod_add_div]
83+
... = a ^ (n % order_of a) :
84+
by simp [pow_add, pow_mul, pow_order_of_eq_one]
85+
86+
lemma gpow_eq_mod_order_of {i : ℤ} : a ^ i = a ^ (i % order_of a) :=
87+
calc a ^ i = a ^ (i % order_of a + order_of a * (i / order_of a)) :
88+
by rw [int.mod_add_div]
89+
... = a ^ (i % order_of a) :
90+
by simp [gpow_add, gpow_mul, pow_order_of_eq_one]
91+
92+
lemma mem_range_gpow_iff_mem_range_order_of {a a' : α} :
93+
a' ∈ range ((^) a : ℤ → α) ↔ a' ∈ (finset.range (order_of a)).image ((^) a : ℕ → α) :=
94+
finset.mem_range_iff_mem_finset_range_of_mod_eq
95+
(nat.pos_iff_ne_zero.mpr (order_of_ne_zero a))
96+
(assume i, gpow_eq_mod_order_of.symm)
97+
98+
instance decidable_range_gpow : decidable_pred (range ((^) a : ℤ → α)) :=
99+
assume a', decidable_of_iff'
100+
(a' ∈ (finset.range (order_of a)).image ((^) a))
101+
mem_range_gpow_iff_mem_range_order_of
102+
103+
section
104+
local attribute [instance] set_fintype
105+
106+
lemma order_eq_card_range_gpow : order_of a = fintype.card (range ((^) a : ℤ → α)) :=
107+
begin
108+
refine (finset.card_eq_of_bijective _ _ _ _).symm,
109+
{ exact λn hn, ⟨gpow a n, mem_range_self n⟩ },
110+
{ exact assume ⟨_, i, rfl⟩ _,
111+
have pos: (0:int) < order_of a,
112+
from int.coe_nat_lt.mpr $ nat.pos_iff_ne_zero.mpr $ order_of_ne_zero a,
113+
have 0 ≤ i % (order_of a),
114+
from int.mod_nonneg _ $ ne_of_gt pos,
115+
⟨int.to_nat (i % order_of a),
116+
by rw [← int.coe_nat_lt, int.to_nat_of_nonneg this];
117+
exact ⟨int.mod_lt_of_pos _ pos, subtype.eq gpow_eq_mod_order_of.symm⟩⟩ },
118+
{ intros, exact finset.mem_univ _ },
119+
{ exact assume i j hi hj eq, pow_injective_of_lt_order_of a hi hj $ by simpa using eq }
120+
end
121+
122+
section classical
123+
local attribute [instance] classical.prop_decidable
124+
125+
/- TODO: use cardinal theory, introduce `card : set α → ℕ`, or setup decidability for cosets -/
126+
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
128+
have ft_prod : fintype (left_cosets (gpowers a) × (gpowers a)),
129+
from fintype.of_equiv α equiv,
130+
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)⟩⟩,
133+
have ft_cosets : fintype (left_cosets (gpowers a)),
134+
from @fintype.fintype_prod_left _ _ _ ft_prod ⟨⟨1, is_submonoid.one_mem (gpowers a)⟩⟩,
135+
have ft : fintype (left_cosets (gpowers a) × (gpowers a)),
136+
from @prod.fintype _ _ ft_cosets ft_s,
137+
have eq₁ : fintype.card α = @fintype.card _ ft_cosets * @fintype.card _ ft_s,
138+
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
140+
... = @fintype.card _ (@prod.fintype _ _ ft_cosets ft_s) :
141+
congr_arg (@fintype.card _) $ subsingleton.elim _ _
142+
... = @fintype.card _ ft_cosets * @fintype.card _ ft_s :
143+
@fintype.card_prod _ _ ft_cosets ft_s,
144+
have eq₂ : order_of a = @fintype.card _ ft_s,
145+
from calc order_of a = _ : order_eq_card_range_gpow
146+
... = _ : congr_arg (@fintype.card _) $ subsingleton.elim _ _,
147+
dvd.intro (@fintype.card (left_cosets (gpowers a)) ft_cosets) $
148+
by rw [eq₁, eq₂, mul_comm]
149+
150+
end classical
151+
152+
end
153+
154+
end order_of

0 commit comments

Comments
 (0)