Skip to content

Commit 0e70892

Browse files
committed
feat: length, reduced words in Coxeter groups (#11465)
Add new file `GroupTheory/Coxeter/Length.lean`. Define the length function and reduced words of Coxeter groups. Prove their basic properties. I decided to split #11408 (now closed) into two pull requests. This is the first one.
1 parent a89745a commit 0e70892

File tree

4 files changed

+451
-1
lines changed

4 files changed

+451
-1
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2418,6 +2418,7 @@ import Mathlib.GroupTheory.Coprod.Basic
24182418
import Mathlib.GroupTheory.CoprodI
24192419
import Mathlib.GroupTheory.Coset
24202420
import Mathlib.GroupTheory.Coxeter.Basic
2421+
import Mathlib.GroupTheory.Coxeter.Length
24212422
import Mathlib.GroupTheory.Coxeter.Matrix
24222423
import Mathlib.GroupTheory.Divisible
24232424
import Mathlib.GroupTheory.DoubleCoset

Mathlib/GroupTheory/Coxeter/Basic.lean

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Newell Jensen, Mitchell Lee
55
-/
66
import Mathlib.GroupTheory.PresentedGroup
77
import Mathlib.GroupTheory.Coxeter.Matrix
8+
import Mathlib.Data.Int.Parity
89

910
/-!
1011
# Coxeter groups and Coxeter systems
@@ -31,7 +32,8 @@ homomorphism $W \to G$ (`CoxeterSystem.lift`) in a unique way.
3132
3233
A *word* is a sequence of elements of $B$. The word $(i_1, \ldots, i_\ell)$ has a corresponding
3334
product $s_{i_1} \cdots s_{i_\ell} \in W$ (`CoxeterSystem.wordProd`). Every element of $W$ is the
34-
product of some word (`CoxeterSystem.wordProd_surjective`).
35+
product of some word (`CoxeterSystem.wordProd_surjective`). The words that alternate between two
36+
elements of $B$ (`CoxeterSystem.alternatingWord`) are particularly important.
3537
3638
## Implementation details
3739
@@ -51,6 +53,7 @@ reflections unless necessary; instead, we state our results in terms of $B$ wher
5153
* `CoxeterSystem.lift` : Extend a function `f : B → G` to a monoid homomorphism `f' : W → G`
5254
satisfying `f' (cs.simple i) = f i` for all `i`.
5355
* `CoxeterSystem.wordProd`
56+
* `CoxeterSystem.alternatingWord`
5457
5558
## References
5659
@@ -373,4 +376,94 @@ theorem wordProd_surjective : Surjective cs.wordProd := by
373376
use i :: ω
374377
rw [wordProd_cons]
375378

379+
/-- The word of length `m` that alternates between `i` and `i'`, ending with `i'`. -/
380+
def alternatingWord (i i' : B) (m : ℕ) : List B :=
381+
match m with
382+
| 0 => []
383+
| m+1 => (alternatingWord i' i m).concat i'
384+
385+
/-- The word of length `M i i'` that alternates between `i` and `i'`, ending with `i'`. -/
386+
abbrev braidWord (M : CoxeterMatrix B) (i i' : B) : List B := alternatingWord i i' (M i i')
387+
388+
theorem alternatingWord_succ (i i' : B) (m : ℕ) :
389+
alternatingWord i i' (m + 1) = (alternatingWord i' i m).concat i' := rfl
390+
391+
theorem alternatingWord_succ' (i i' : B) (m : ℕ) :
392+
alternatingWord i i' (m + 1) = (if Even m then i' else i) :: alternatingWord i i' m := by
393+
induction' m with m ih generalizing i i'
394+
· simp [alternatingWord]
395+
· rw [alternatingWord]
396+
nth_rw 1 [ih i' i]
397+
rw [alternatingWord]
398+
simp [Nat.even_add_one]
399+
400+
@[simp]
401+
theorem length_alternatingWord (i i' : B) (m : ℕ) :
402+
List.length (alternatingWord i i' m) = m := by
403+
induction' m with m ih generalizing i i'
404+
· dsimp [alternatingWord]
405+
· simpa [alternatingWord] using ih i' i
406+
407+
theorem prod_alternatingWord_eq_mul_pow (i i' : B) (m : ℕ) :
408+
π (alternatingWord i i' m) = (if Even m then 1 else s i') * (s i * s i') ^ (m / 2) := by
409+
induction' m with m ih
410+
· simp [alternatingWord]
411+
· rw [alternatingWord_succ', wordProd_cons, ih]
412+
rcases Nat.even_or_odd m with even | odd
413+
· rcases even with ⟨k, rfl⟩
414+
ring_nf
415+
have : Odd (1 + k * 2) := by use k; ring
416+
simp [← two_mul, Nat.odd_iff_not_even.mp this]
417+
rw [Nat.add_mul_div_right _ _ (by norm_num : 0 < 2)]
418+
norm_num
419+
· rcases odd with ⟨k, rfl⟩
420+
ring_nf
421+
have h₁ : Odd (1 + k * 2) := by use k; ring
422+
have h₂ : Even (2 + k * 2) := by use (k + 1); ring
423+
simp [Nat.odd_iff_not_even.mp h₁, h₂]
424+
rw [Nat.add_mul_div_right _ _ (by norm_num : 0 < 2)]
425+
norm_num
426+
rw [pow_succ', mul_assoc]
427+
428+
theorem prod_alternatingWord_eq_prod_alternatingWord_sub (i i' : B) (m : ℕ) (hm : m ≤ M i i' * 2) :
429+
π (alternatingWord i i' m) = π (alternatingWord i' i (M i i' * 2 - m)) := by
430+
simp_rw [prod_alternatingWord_eq_mul_pow, ← Int.even_coe_nat]
431+
432+
/- Rewrite everything in terms of an integer m' which is equal to m.
433+
The resulting equation holds for all integers m'. -/
434+
simp_rw [← zpow_natCast, Int.ofNat_ediv, Int.ofNat_sub hm]
435+
generalize (m : ℤ) = m'
436+
clear hm
437+
push_cast
438+
439+
rcases Int.even_or_odd' m' with ⟨k, rfl | rfl⟩
440+
· rw [if_pos (by use k; ring), if_pos (by use -k + (M i i'); ring), mul_comm 2 k, ← sub_mul]
441+
repeat rw [Int.mul_ediv_cancel _ (by norm_num)]
442+
rw [zpow_sub, zpow_natCast, simple_mul_simple_pow' cs i i', ← inv_zpow]
443+
simp
444+
· have : ¬Even (2 * k + 1) := Int.odd_iff_not_even.mp ⟨k, rfl⟩
445+
rw [if_neg this]
446+
have : ¬Even (↑(M i i') * 2 - (2 * k + 1)) :=
447+
Int.odd_iff_not_even.mp ⟨↑(M i i') - k - 1, by ring⟩
448+
rw [if_neg this]
449+
450+
rw [(by ring : ↑(M i i') * 2 - (2 * k + 1) = -1 + (-k + ↑(M i i')) * 2),
451+
(by ring : 2 * k + 1 = 1 + k * 2)]
452+
repeat rw [Int.add_mul_ediv_right _ _ (by norm_num)]
453+
norm_num
454+
455+
rw [zpow_add, zpow_add, zpow_natCast, simple_mul_simple_pow', zpow_neg, ← inv_zpow, zpow_neg,
456+
← inv_zpow]
457+
simp [← mul_assoc]
458+
459+
/-- The two words of length `M i i'` that alternate between `i` and `i'` have the same product.
460+
This is known as the "braid relation" or "Artin-Tits relation". -/
461+
theorem wordProd_braidWord_eq (i i' : B) :
462+
π (braidWord M i i') = π (braidWord M i' i) := by
463+
have := cs.prod_alternatingWord_eq_prod_alternatingWord_sub i i' (M i i')
464+
(Nat.le_mul_of_pos_right _ (by norm_num))
465+
rw [tsub_eq_of_eq_add (mul_two (M i i'))] at this
466+
nth_rw 2 [M.symmetric i i'] at this
467+
exact this
468+
376469
end CoxeterSystem

0 commit comments

Comments
 (0)