Skip to content

Commit 17a9927

Browse files
feat(LinearAlgebra/RootSystem/Defs): Properties of pairs of roots (#10666)
Given a pair of roots, we can describe the "angle" between them using the pairing between root `i` and coroot `j` together with the reverse pairing. This PR adds language for describing the various cases. Co-authored-by: Oliver Nash <github@olivernash.org>
1 parent a3508a5 commit 17a9927

File tree

2 files changed

+92
-18
lines changed

2 files changed

+92
-18
lines changed

Mathlib/LinearAlgebra/RootSystem/Basic.lean

Lines changed: 72 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,24 +41,43 @@ variable {ι R M N : Type*}
4141

4242
namespace RootPairing
4343

44-
variable (P : RootPairing ι R M N) (i : ι)
44+
variable (P : RootPairing ι R M N) (i j : ι)
45+
46+
lemma root_ne (h: i ≠ j) : P.root i ≠ P.root j := by
47+
simp_all only [ne_eq, EmbeddingLike.apply_eq_iff_eq, not_false_eq_true]
4548

4649
lemma ne_zero [CharZero R] : (P.root i : M) ≠ 0 :=
4750
fun h ↦ by simpa [h] using P.root_coroot_two i
4851

4952
lemma ne_zero' [CharZero R] : (P.coroot i : N) ≠ 0 :=
5053
fun h ↦ by simpa [h] using P.root_coroot_two i
5154

55+
@[simp]
56+
lemma root_coroot_eq_pairing :
57+
P.toLin (P.root i) (P.coroot j) = P.pairing i j :=
58+
rfl
59+
60+
lemma coroot_root_eq_pairing :
61+
P.toLin.flip (P.coroot i) (P.root j) = P.pairing j i := by
62+
simp
63+
64+
@[simp]
65+
lemma pairing_same : P.pairing i i = 2 := P.root_coroot_two i
66+
5267
lemma coroot_root_two :
53-
(P.toLin.flip (P.coroot i)) (P.root i) = 2 := by
54-
rw [LinearMap.flip_apply, P.root_coroot_two i]
68+
P.toLin.flip (P.coroot i) (P.root i) = 2 := by
69+
simp
5570

5671
@[simp] lemma flip_flip : P.flip.flip = P := rfl
5772

5873
lemma reflection_apply (x : M) :
5974
P.reflection i x = x - (P.toLin x (P.coroot i)) • P.root i :=
6075
rfl
6176

77+
lemma reflection_apply_root :
78+
P.reflection i (P.root j) = P.root j - (P.pairing j i) • P.root i :=
79+
rfl
80+
6281
@[simp]
6382
lemma reflection_apply_self :
6483
P.reflection i (P.root i) = - P.root i :=
@@ -113,23 +132,57 @@ lemma reflection_dualMap_eq_coreflection :
113132
ext n m
114133
simp [coreflection_apply, reflection_apply, mul_comm (P.toLin m (P.coroot i))]
115134

116-
variable [Finite ι]
135+
lemma reflection_mul (x : M) :
136+
(P.reflection i * P.reflection j) x = P.reflection i (P.reflection j x) := rfl
137+
138+
lemma isCrystallographic_iff :
139+
P.IsCrystallographic ↔ ∀ i j, ∃ z : ℤ, z = P.pairing i j := by
140+
rw [IsCrystallographic]
141+
refine ⟨fun h i j ↦ ?_, fun h i _ ⟨j, hj⟩ ↦ ?_⟩
142+
· simpa [AddSubgroup.mem_zmultiples_iff] using h i (mem_range_self j)
143+
· simpa [← hj, AddSubgroup.mem_zmultiples_iff] using h i j
144+
145+
lemma isReduced_iff : P.IsReduced ↔ ∀ (i j : ι), i ≠ j →
146+
¬ LinearIndependent R ![P.root i, P.root j] → P.root i = - P.root j := by
147+
rw [IsReduced]
148+
refine ⟨fun h i j hij hLin ↦ ?_, fun h i j hLin ↦ ?_⟩
149+
· specialize h i j hLin
150+
simp_all only [ne_eq, EmbeddingLike.apply_eq_iff_eq, false_or]
151+
· by_cases h' : i = j
152+
· exact Or.inl (congrArg (⇑P.root) h')
153+
· exact Or.inr (h i j h' hLin)
154+
155+
section pairs
156+
157+
lemma coxeterWeight_swap : coxeterWeight P i j = coxeterWeight P j i := by
158+
simp only [coxeterWeight, mul_comm]
159+
160+
lemma IsOrthogonal.symm : IsOrthogonal P i j ↔ IsOrthogonal P j i := by
161+
simp only [IsOrthogonal, and_comm]
162+
163+
lemma IsOrthogonal_comm (h : IsOrthogonal P i j) : Commute (P.reflection i) (P.reflection j) := by
164+
rw [Commute, SemiconjBy]
165+
ext v
166+
simp_all only [IsOrthogonal, reflection_mul, reflection_apply, smul_sub]
167+
simp_all only [map_sub, map_smul, LinearMap.sub_apply, LinearMap.smul_apply,
168+
root_coroot_eq_pairing, smul_eq_mul, mul_zero, sub_zero]
169+
exact sub_right_comm v ((P.toLin v) (P.coroot j) • P.root j)
170+
((P.toLin v) (P.coroot i) • P.root i)
171+
172+
end pairs
117173

118-
/-- Even though the roots may not span, coroots are distinguished by their pairing with the
119-
roots. The proof depends crucially on the fact that there are finitely-many roots.
174+
variable [Finite ι]
120175

121-
Modulo trivial generalisations, this statement is exactly Lemma 1.1.4 on page 87 of SGA 3 XXI.
122-
See also `RootPairing.injOn_dualMap_subtype_span_root_coroot` for a more useful restatement. -/
123-
lemma eq_of_forall_coroot_root_eq [NoZeroSMulDivisors ℤ M] (i j : ι)
124-
(h : ∀ k, P.toLin (P.root k) (P.coroot i) = P.toLin (P.root k) (P.coroot j)) :
176+
lemma eq_of_pairing_pairing_eq_two [NoZeroSMulDivisors ℤ M] (i j : ι)
177+
(hij : P.pairing i j = 2) (hji : P.pairing j i = 2) :
125178
i = j := by
126179
set α := P.root i
127180
set β := P.root j
128181
set sα : M ≃ₗ[R] M := P.reflection i
129182
set sβ : M ≃ₗ[R] M := P.reflection j
130183
set sαβ : M ≃ₗ[R] M := sβ.trans sα
131-
have hα : sα β = β - (2 : R) • α := by rw [P.reflection_apply, h j, P.root_coroot_two j]
132-
have hβ : sβ α = α - (2 : R) • β := by rw [P.reflection_apply, ← h i, P.root_coroot_two i]
184+
have hα : sα β = β - (2 : R) • α := by rw [P.reflection_apply_root, hji]
185+
have hβ : sβ α = α - (2 : R) • β := by rw [P.reflection_apply_root, hij]
133186
have hb : BijOn sαβ (range P.root) (range P.root) :=
134187
(P.bijOn_reflection_root i).comp (P.bijOn_reflection_root j)
135188
set f : ℕ → M := fun n ↦ β + (2 * n : ℤ) • (α - β)
@@ -149,11 +202,17 @@ lemma eq_of_forall_coroot_root_eq [NoZeroSMulDivisors ℤ M] (i j : ι)
149202
sub_eq_zero] at hnm
150203
linarith [hnm.resolve_right (P.root.injective.ne this)]
151204

205+
/-- Even though the roots may not span, coroots are distinguished by their pairing with the
206+
roots. The proof depends crucially on the fact that there are finitely-many roots.
207+
208+
Modulo trivial generalisations, this statement is exactly Lemma 1.1.4 on page 87 of SGA 3 XXI. -/
152209
lemma injOn_dualMap_subtype_span_root_coroot [NoZeroSMulDivisors ℤ M] :
153210
InjOn ((span R (range P.root)).subtype.dualMap ∘ₗ P.toLin.flip) (range P.coroot) := by
154211
rintro - ⟨i, rfl⟩ - ⟨j, rfl⟩ hij
155212
congr
156-
refine P.eq_of_forall_coroot_root_eq i j fun k ↦ ?_
213+
suffices ∀ k, P.pairing k i = P.pairing k j from
214+
P.eq_of_pairing_pairing_eq_two i j (by simp [← this i]) (by simp [this j])
215+
intro k
157216
simpa using LinearMap.congr_fun hij ⟨P.root k, Submodule.subset_span (mem_range_self k)⟩
158217

159218
/-- In characteristic zero if there is no torsion, the correspondence between roots and coroots is

Mathlib/LinearAlgebra/RootSystem/Defs.lean

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ This file contains basic definitions for root systems and root data.
2828
## Todo
2929
3030
* Introduce the Weyl Group
31-
* Coxeter weights of pairs
32-
* Properties of pairs of roots, e.g., parallel, ultraparallel, definite, orthogonal, imaginary,
33-
non-symmetrizable
31+
* Base change of root pairings.
32+
* Isomorphism of root pairings.
33+
* Crystallographic root systems are isomorphic to base changes of root systems over ℤ?
3434
3535
## Implementation details
3636
@@ -110,9 +110,10 @@ always an integer.-/
110110
def IsCrystallographic : Prop :=
111111
∀ i, MapsTo (P.toLin (P.root i)) (range P.coroot) (zmultiples (1 : R))
112112

113-
/-- A root pairing is said to be reduced if it never contains the double of a root.-/
113+
/-- A root pairing is said to be reduced if any linearly dependent pair of roots is related by a
114+
sign. -/
114115
def IsReduced : Prop :=
115-
∀ i, 2P.root i ∉ range P.root
116+
∀ i j, ¬ LinearIndependent R ![P.root i, P.root j] → (P.root i = P.root j ∨ P.root i = - P.root j)
116117

117118
/-- If we interchange the roles of `M` and `N`, we still have a root pairing. -/
118119
protected def flip : RootPairing ι R N M :=
@@ -130,3 +131,17 @@ def reflection : M ≃ₗ[R] M :=
130131
/-- The reflection associated to a coroot. -/
131132
def coreflection : N ≃ₗ[R] N :=
132133
Module.reflection (P.root_coroot_two i)
134+
135+
section pairs
136+
137+
variable (j : ι)
138+
139+
/-- This is the pairing between roots and coroots. -/
140+
def pairing : R := P.toLin (P.root i) (P.coroot j)
141+
142+
/-- The Coxeter Weight of a pair gives the weight of an edge in a Coxeter diagram, when it is
143+
finite. It is `4 cos² θ`, where `θ` describes the dihedral angle between hyperplanes. -/
144+
def coxeterWeight : R := pairing P i j * pairing P j i
145+
146+
/-- Two roots are orthogonal when they are fixed by each others' reflections. -/
147+
def IsOrthogonal : Prop := pairing P i j = 0 ∧ pairing P j i = 0

0 commit comments

Comments
 (0)