Skip to content

Commit be86c99

Browse files
committed
feat (LinearAlgebra/RootSystem/Defs): define Weyl group (#15702)
This PR defines the Weyl group of a root pairing, and its permutation representation on the indexing set of roots. Co-authored-by: Deepro Choudhury
1 parent 89c72c4 commit be86c99

File tree

2 files changed

+199
-11
lines changed

2 files changed

+199
-11
lines changed

Mathlib/Algebra/Group/Subgroup/Pointwise.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,16 @@ instance sup_normal (H K : Subgroup G) [hH : H.Normal] [hK : K.Normal] : (H ⊔
242242
refine ⟨g * h * g⁻¹, hH.conj_mem h hh g, g * k * g⁻¹, hK.conj_mem k hk g, ?_⟩
243243
simp only [mul_assoc, inv_mul_cancel_left]
244244

245+
@[to_additive]
246+
theorem smul_mem_of_mem_closure_of_mem {X : Type*} [MulAction G X] {s : Set G} {t : Set X}
247+
(hs : ∀ g ∈ s, g⁻¹ ∈ s) (hst : ∀ᵉ (g ∈ s) (x ∈ t), g • x ∈ t) {g : G}
248+
(hg : g ∈ Subgroup.closure s) {x : X} (hx : x ∈ t) : g • x ∈ t := by
249+
induction hg using Subgroup.closure_induction'' generalizing x with
250+
| one => simpa
251+
| mem g' hg' => exact hst g' hg' x hx
252+
| inv_mem g' hg' => exact hst g'⁻¹ (hs g' hg') x hx
253+
| mul _ _ _ _ h₁ h₂ => rw [mul_smul]; exact h₁ (h₂ hx)
254+
245255
@[to_additive]
246256
theorem smul_opposite_image_mul_preimage' (g : G) (h : Gᵐᵒᵖ) (s : Set G) :
247257
(fun y => h • y) '' ((g * ·) ⁻¹' s) = (g * ·) ⁻¹' ((fun y => h • y) '' s) := by

Mathlib/LinearAlgebra/RootSystem/Defs.lean

Lines changed: 189 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,25 @@ This file contains basic definitions for root systems and root data.
1616
* `RootPairing`: Given two perfectly-paired `R`-modules `M` and `N` (over some commutative ring
1717
`R`) a root pairing with indexing set `ι` is the data of an `ι`-indexed subset of `M`
1818
("the roots") an `ι`-indexed subset of `N` ("the coroots"), and an `ι`-indexed set of
19-
permutations of `ι` such that each root-coroot pair
20-
evaluates to `2`, and the permutation attached to each element of `ι` is compatible with the
21-
reflections on the corresponding roots and coroots.
19+
permutations of `ι` such that each root-coroot pair evaluates to `2`, and the permutation
20+
attached to each element of `ι` is compatible with the reflections on the corresponding roots and
21+
coroots.
2222
* `RootDatum`: A root datum is a root pairing for which the roots and coroots take values in
2323
finitely-generated free Abelian groups.
2424
* `RootSystem`: A root system is a root pairing for which the roots span their ambient module.
2525
* `RootPairing.IsCrystallographic`: A root pairing is said to be crystallographic if the pairing
2626
between a root and coroot is always an integer.
27-
* `RootPairing.IsReduced`: A root pairing is said to be reduced if it never contains the double of
28-
a root.
27+
* `RootPairing.IsReduced`: A root pairing is said to be reduced if two linearly dependent roots are
28+
always related by a sign.
29+
* `RootPairing.weylGroup`: The group of linear isomorphisms on `M` generated by reflections.
30+
* `RootPairing.weylGroupToPerm`: The permutation representation of the Weyl group on `ι`.
2931
3032
## TODO
3133
32-
* Put more API theorems in the Defs file.
33-
* Introduce the Weyl Group, and its action on the indexing set.
34-
* Base change of root pairings (may need flatness).
35-
* Isomorphism of root pairings.
36-
* Crystallographic root systems are isomorphic to base changes of root systems over `ℤ`: Take
37-
`M₀` and `N₀` to be the `ℤ`-span of roots and coroots.
34+
* Base change of root pairings (may need flatness; perhaps should go in a different file).
35+
* Isomorphism of root pairings.
36+
* Crystallographic root systems are isomorphic to base changes of root systems over `ℤ`: Take
37+
`M₀` and `N₀` to be the `ℤ`-span of roots and coroots.
3838
3939
## Implementation details
4040
@@ -115,6 +115,8 @@ required to be the dual of `M`. -/
115115
structure RootSystem extends RootPairing ι R M N :=
116116
span_eq_top : span R (range root) = ⊤
117117

118+
attribute [simp] RootSystem.span_eq_top
119+
118120
namespace RootPairing
119121

120122
variable {ι R M N}
@@ -189,6 +191,28 @@ lemma reflection_same (x : M) :
189191
P.reflection i (P.reflection i x) = x :=
190192
Module.involutive_reflection (P.coroot_root_two i) x
191193

194+
@[simp]
195+
lemma reflection_inv :
196+
(P.reflection i)⁻¹ = P.reflection i :=
197+
rfl
198+
199+
@[simp]
200+
lemma reflection_sq :
201+
P.reflection i ^ 2 = 1 :=
202+
mul_eq_one_iff_eq_inv.mpr rfl
203+
204+
@[simp]
205+
lemma reflection_perm_sq :
206+
P.reflection_perm i ^ 2 = 1 := by
207+
ext j
208+
refine Embedding.injective P.root ?_
209+
simp only [sq, Equiv.Perm.mul_apply, root_reflection_perm, reflection_same, Equiv.Perm.one_apply]
210+
211+
@[simp]
212+
lemma reflection_perm_inv :
213+
(P.reflection_perm i)⁻¹ = P.reflection_perm i :=
214+
(mul_eq_one_iff_eq_inv.mp <| P.reflection_perm_sq i).symm
215+
192216
lemma bijOn_reflection_root :
193217
BijOn (P.reflection i) (range P.root) (range P.root) :=
194218
Module.bijOn_reflection_of_mapsTo _ <| P.mapsTo_reflection_root i
@@ -230,6 +254,16 @@ lemma coreflection_same (x : N) :
230254
P.coreflection i (P.coreflection i x) = x :=
231255
Module.involutive_reflection (P.flip.coroot_root_two i) x
232256

257+
@[simp]
258+
lemma coreflection_inv :
259+
(P.coreflection i)⁻¹ = P.coreflection i :=
260+
rfl
261+
262+
@[simp]
263+
lemma coreflection_sq :
264+
P.coreflection i ^ 2 = 1 :=
265+
mul_eq_one_iff_eq_inv.mpr rfl
266+
233267
lemma bijOn_coreflection_coroot : BijOn (P.coreflection i) (range P.coroot) (range P.coroot) :=
234268
bijOn_reflection_root P.flip i
235269

@@ -280,6 +314,150 @@ lemma isReduced_iff : P.IsReduced ↔ ∀ i j : ι, i ≠ j →
280314
· exact Or.inl (congrArg P.root h')
281315
· exact Or.inr (h i j h' hLin)
282316

317+
/-- The `Weyl group` of a root pairing is the group of automorphisms of the weight space generated
318+
by reflections in roots. -/
319+
def weylGroup : Subgroup (M ≃ₗ[R] M) :=
320+
Subgroup.closure (range P.reflection)
321+
322+
lemma reflection_mem_weylGroup : P.reflection i ∈ P.weylGroup :=
323+
Subgroup.subset_closure <| mem_range_self i
324+
325+
lemma mem_range_root_of_mem_range_reflection_of_mem_range_root
326+
{r : M ≃ₗ[R] M} {α : M} (hr : r ∈ range P.reflection) (hα : α ∈ range P.root) :
327+
r • α ∈ range P.root := by
328+
obtain ⟨i, rfl⟩ := hr
329+
obtain ⟨j, rfl⟩ := hα
330+
exact ⟨P.reflection_perm i j, P.root_reflection_perm i j⟩
331+
332+
lemma mem_range_coroot_of_mem_range_coreflection_of_mem_range_coroot
333+
{r : N ≃ₗ[R] N} {α : N} (hr : r ∈ range P.coreflection) (hα : α ∈ range P.coroot) :
334+
r • α ∈ range P.coroot := by
335+
obtain ⟨i, rfl⟩ := hr
336+
obtain ⟨j, rfl⟩ := hα
337+
exact ⟨P.reflection_perm i j, P.coroot_reflection_perm i j⟩
338+
339+
lemma exists_root_eq_smul_of_mem_weylGroup {w : M ≃ₗ[R] M} (hw : w ∈ P.weylGroup) (i : ι) :
340+
∃ j, P.root j = w • P.root i :=
341+
Subgroup.smul_mem_of_mem_closure_of_mem (by simp)
342+
(fun _ h _ ↦ P.mem_range_root_of_mem_range_reflection_of_mem_range_root h) hw (mem_range_self i)
343+
344+
/-- The permutation representation of the Weyl group induced by `reflection_perm`. -/
345+
def weylGroupToPerm : P.weylGroup →* Equiv.Perm ι where
346+
toFun w :=
347+
{ toFun := fun i => (P.exists_root_eq_smul_of_mem_weylGroup w.2 i).choose
348+
invFun := fun i => (P.exists_root_eq_smul_of_mem_weylGroup w⁻¹.2 i).choose
349+
left_inv := fun i => by
350+
obtain ⟨w, hw⟩ := w
351+
apply P.root.injective
352+
rw [(P.exists_root_eq_smul_of_mem_weylGroup ((Subgroup.inv_mem_iff P.weylGroup).mpr hw)
353+
((P.exists_root_eq_smul_of_mem_weylGroup hw i).choose)).choose_spec,
354+
(P.exists_root_eq_smul_of_mem_weylGroup hw i).choose_spec, inv_smul_smul]
355+
right_inv := fun i => by
356+
obtain ⟨w, hw⟩ := w
357+
have hw' : w⁻¹ ∈ P.weylGroup := (Subgroup.inv_mem_iff P.weylGroup).mpr hw
358+
apply P.root.injective
359+
rw [(P.exists_root_eq_smul_of_mem_weylGroup hw
360+
((P.exists_root_eq_smul_of_mem_weylGroup hw' i).choose)).choose_spec,
361+
(P.exists_root_eq_smul_of_mem_weylGroup hw' i).choose_spec, smul_inv_smul] }
362+
map_one' := by ext; simp
363+
map_mul' x y := by
364+
obtain ⟨x, hx⟩ := x
365+
obtain ⟨y, hy⟩ := y
366+
ext i
367+
apply P.root.injective
368+
simp only [Equiv.coe_fn_mk, Equiv.Perm.coe_mul, comp_apply]
369+
rw [(P.exists_root_eq_smul_of_mem_weylGroup (mul_mem hx hy) i).choose_spec,
370+
(P.exists_root_eq_smul_of_mem_weylGroup hx
371+
((P.exists_root_eq_smul_of_mem_weylGroup hy i).choose)).choose_spec,
372+
(P.exists_root_eq_smul_of_mem_weylGroup hy i).choose_spec, mul_smul]
373+
374+
@[simp]
375+
lemma weylGroupToPerm_apply_reflection :
376+
P.weylGroupToPerm ⟨P.reflection i, P.reflection_mem_weylGroup i⟩ = P.reflection_perm i := by
377+
ext j
378+
apply P.root.injective
379+
rw [weylGroupToPerm, MonoidHom.coe_mk, OneHom.coe_mk, Equiv.coe_fn_mk, root_reflection_perm,
380+
(P.exists_root_eq_smul_of_mem_weylGroup (P.reflection_mem_weylGroup i) j).choose_spec,
381+
LinearEquiv.smul_def]
382+
383+
@[simp]
384+
lemma range_weylGroupToPerm :
385+
P.weylGroupToPerm.range = Subgroup.closure (range P.reflection_perm) := by
386+
refine (Subgroup.closure_eq_of_le _ ?_ ?_).symm
387+
· rintro - ⟨i, rfl⟩
388+
simpa only [← weylGroupToPerm_apply_reflection] using mem_range_self _
389+
· rintro - ⟨⟨w, hw⟩, rfl⟩
390+
induction hw using Subgroup.closure_induction'' with
391+
| one =>
392+
change P.weylGroupToPerm 1 ∈ _
393+
simpa only [map_one] using Subgroup.one_mem _
394+
| mem w' hw' =>
395+
obtain ⟨i, rfl⟩ := hw'
396+
simpa only [weylGroupToPerm_apply_reflection] using Subgroup.subset_closure (mem_range_self i)
397+
| inv_mem w' hw' =>
398+
obtain ⟨i, rfl⟩ := hw'
399+
simpa only [reflection_inv, weylGroupToPerm_apply_reflection] using
400+
Subgroup.subset_closure (mem_range_self i)
401+
| mul w₁ w₂ hw₁ hw₂ h₁ h₂ =>
402+
simpa only [← Submonoid.mk_mul_mk _ w₁ w₂ hw₁ hw₂, map_mul] using Subgroup.mul_mem _ h₁ h₂
403+
404+
lemma pairing_smul_root_eq (k : ι) (hij : P.reflection_perm i = P.reflection_perm j) :
405+
P.pairing k i • P.root i = P.pairing k j • P.root j := by
406+
have h : P.reflection i (P.root k) = P.reflection j (P.root k) := by
407+
simp only [← root_reflection_perm, hij]
408+
simpa only [reflection_apply_root, sub_right_inj] using h
409+
410+
lemma pairing_smul_coroot_eq (k : ι) (hij : P.reflection_perm i = P.reflection_perm j) :
411+
P.pairing i k • P.coroot i = P.pairing j k • P.coroot j := by
412+
have h : P.coreflection i (P.coroot k) = P.coreflection j (P.coroot k) := by
413+
simp only [← coroot_reflection_perm, hij]
414+
simpa only [coreflection_apply_coroot, sub_right_inj] using h
415+
416+
lemma two_nsmul_reflection_eq_of_perm_eq (hij : P.reflection_perm i = P.reflection_perm j) :
417+
2 • ⇑(P.reflection i) = 2 • P.reflection j := by
418+
ext x
419+
suffices 2 • P.toLin x (P.coroot i) • P.root i = 2 • P.toLin x (P.coroot j) • P.root j by
420+
simpa [reflection_apply]
421+
calc 2 • P.toLin x (P.coroot i) • P.root i
422+
= P.toLin x (P.coroot i) • ((2 : R) • P.root i) := ?_
423+
_ = P.toLin x (P.coroot i) • (P.pairing i j • P.root j) := ?_
424+
_ = P.toLin x (P.pairing i j • P.coroot i) • (P.root j) := ?_
425+
_ = P.toLin x ((2 : R) • P.coroot j) • (P.root j) := ?_
426+
_ = 2 • P.toLin x (P.coroot j) • P.root j := ?_
427+
· rw [smul_comm, ← Nat.cast_smul_eq_nsmul R, Nat.cast_ofNat]
428+
· rw [P.pairing_smul_root_eq j i i hij.symm, pairing_same]
429+
· rw [← smul_comm, ← smul_assoc, map_smul]
430+
· rw [← P.pairing_smul_coroot_eq j i j hij.symm, pairing_same]
431+
· rw [map_smul, smul_assoc, ← Nat.cast_smul_eq_nsmul R, Nat.cast_ofNat]
432+
433+
lemma reflection_perm_eq_reflection_perm_iff_of_isSMulRegular (h2 : IsSMulRegular M 2) :
434+
P.reflection_perm i = P.reflection_perm j ↔ P.reflection i = P.reflection j := by
435+
refine ⟨fun h ↦ ?_, fun h ↦ Equiv.ext fun k ↦ P.root.injective <| by simp [h]⟩
436+
suffices ⇑(P.reflection i) = ⇑(P.reflection j) from DFunLike.coe_injective this
437+
replace h2 : IsSMulRegular (M → M) 2 := IsSMulRegular.pi fun _ ↦ h2
438+
exact h2 <| P.two_nsmul_reflection_eq_of_perm_eq i j h
439+
440+
lemma reflection_perm_eq_reflection_perm_iff_of_span :
441+
P.reflection_perm i = P.reflection_perm j ↔
442+
∀ x ∈ span R (range P.root), P.reflection i x = P.reflection j x := by
443+
refine ⟨fun h x hx ↦ ?_, fun h ↦ ?_⟩
444+
· induction hx using Submodule.span_induction' with
445+
| mem x hx =>
446+
obtain ⟨k, rfl⟩ := hx
447+
simp only [← root_reflection_perm, h]
448+
| zero => simp
449+
| add x _ y _ hx hy => simp [hx, hy]
450+
| smul t x _ hx => simp [hx]
451+
· ext k
452+
apply P.root.injective
453+
simp [h (P.root k) (Submodule.subset_span <| mem_range_self k)]
454+
455+
lemma _root_.RootSystem.reflection_perm_eq_reflection_perm_iff (P : RootSystem ι R M N) (i j : ι) :
456+
P.reflection_perm i = P.reflection_perm j ↔ P.reflection i = P.reflection j := by
457+
refine ⟨fun h ↦ ?_, fun h ↦ Equiv.ext fun k ↦ P.root.injective <| by simp [h]⟩
458+
ext x
459+
exact (P.reflection_perm_eq_reflection_perm_iff_of_span i j).mp h x <| by simp
460+
283461
/-- The Coxeter Weight of a pair gives the weight of an edge in a Coxeter diagram, when it is
284462
finite. It is `4 cos² θ`, where `θ` describes the dihedral angle between hyperplanes. -/
285463
def coxeterWeight : R := pairing P i j * pairing P j i

0 commit comments

Comments
 (0)