@@ -16,25 +16,25 @@ This file contains basic definitions for root systems and root data.
16
16
* `RootPairing`: Given two perfectly-paired `R`-modules `M` and `N` (over some commutative ring
17
17
`R`) a root pairing with indexing set `ι` is the data of an `ι`-indexed subset of `M`
18
18
("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.
22
22
* `RootDatum`: A root datum is a root pairing for which the roots and coroots take values in
23
23
finitely-generated free Abelian groups.
24
24
* `RootSystem`: A root system is a root pairing for which the roots span their ambient module.
25
25
* `RootPairing.IsCrystallographic`: A root pairing is said to be crystallographic if the pairing
26
26
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 `ι`.
29
31
30
32
## TODO
31
33
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.
38
38
39
39
## Implementation details
40
40
@@ -115,6 +115,8 @@ required to be the dual of `M`. -/
115
115
structure RootSystem extends RootPairing ι R M N :=
116
116
span_eq_top : span R (range root) = ⊤
117
117
118
+ attribute [simp] RootSystem.span_eq_top
119
+
118
120
namespace RootPairing
119
121
120
122
variable {ι R M N}
@@ -189,6 +191,28 @@ lemma reflection_same (x : M) :
189
191
P.reflection i (P.reflection i x) = x :=
190
192
Module.involutive_reflection (P.coroot_root_two i) x
191
193
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
+
192
216
lemma bijOn_reflection_root :
193
217
BijOn (P.reflection i) (range P.root) (range P.root) :=
194
218
Module.bijOn_reflection_of_mapsTo _ <| P.mapsTo_reflection_root i
@@ -230,6 +254,16 @@ lemma coreflection_same (x : N) :
230
254
P.coreflection i (P.coreflection i x) = x :=
231
255
Module.involutive_reflection (P.flip.coroot_root_two i) x
232
256
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
+
233
267
lemma bijOn_coreflection_coroot : BijOn (P.coreflection i) (range P.coroot) (range P.coroot) :=
234
268
bijOn_reflection_root P.flip i
235
269
@@ -280,6 +314,150 @@ lemma isReduced_iff : P.IsReduced ↔ ∀ i j : ι, i ≠ j →
280
314
· exact Or.inl (congrArg P.root h')
281
315
· exact Or.inr (h i j h' hLin)
282
316
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
+
283
461
/-- The Coxeter Weight of a pair gives the weight of an edge in a Coxeter diagram, when it is
284
462
finite. It is `4 cos² θ`, where `θ` describes the dihedral angle between hyperplanes. -/
285
463
def coxeterWeight : R := pairing P i j * pairing P j i
0 commit comments