@@ -41,24 +41,43 @@ variable {ι R M N : Type*}
41
41
42
42
namespace RootPairing
43
43
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]
45
48
46
49
lemma ne_zero [CharZero R] : (P.root i : M) ≠ 0 :=
47
50
fun h ↦ by simpa [h] using P.root_coroot_two i
48
51
49
52
lemma ne_zero' [CharZero R] : (P.coroot i : N) ≠ 0 :=
50
53
fun h ↦ by simpa [h] using P.root_coroot_two i
51
54
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
+
52
67
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
55
70
56
71
@[simp] lemma flip_flip : P.flip.flip = P := rfl
57
72
58
73
lemma reflection_apply (x : M) :
59
74
P.reflection i x = x - (P.toLin x (P.coroot i)) • P.root i :=
60
75
rfl
61
76
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
+
62
81
@[simp]
63
82
lemma reflection_apply_self :
64
83
P.reflection i (P.root i) = - P.root i :=
@@ -113,23 +132,57 @@ lemma reflection_dualMap_eq_coreflection :
113
132
ext n m
114
133
simp [coreflection_apply, reflection_apply, mul_comm (P.toLin m (P.coroot i))]
115
134
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
117
173
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 ι]
120
175
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 ) :
125
178
i = j := by
126
179
set α := P.root i
127
180
set β := P.root j
128
181
set sα : M ≃ₗ[R] M := P.reflection i
129
182
set sβ : M ≃ₗ[R] M := P.reflection j
130
183
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 ]
133
186
have hb : BijOn sαβ (range P.root) (range P.root) :=
134
187
(P.bijOn_reflection_root i).comp (P.bijOn_reflection_root j)
135
188
set f : ℕ → M := fun n ↦ β + (2 * n : ℤ) • (α - β)
@@ -149,11 +202,17 @@ lemma eq_of_forall_coroot_root_eq [NoZeroSMulDivisors ℤ M] (i j : ι)
149
202
sub_eq_zero] at hnm
150
203
linarith [hnm.resolve_right (P.root.injective.ne this)]
151
204
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. -/
152
209
lemma injOn_dualMap_subtype_span_root_coroot [NoZeroSMulDivisors ℤ M] :
153
210
InjOn ((span R (range P.root)).subtype.dualMap ∘ₗ P.toLin.flip) (range P.coroot) := by
154
211
rintro - ⟨i, rfl⟩ - ⟨j, rfl⟩ hij
155
212
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
157
216
simpa using LinearMap.congr_fun hij ⟨P.root k, Submodule.subset_span (mem_range_self k)⟩
158
217
159
218
/-- In characteristic zero if there is no torsion, the correspondence between roots and coroots is
0 commit comments