Skip to content

Commit 79ad6ef

Browse files
committed
feat: drop ordering assumption in RootPairing.coxeterWeight_mem_set_of_isCrystallographic (#21122)
Some of the required changes also allow us to unify (and generalise) the `RootPairing.IsAnisotropic` instances. The means of obtaining these generalisations is to work with a root pairing with coefficients in `R` taking values in an ordered subring `S` (in the sense of `RootPairing.IsValuedIn`). This allows us to avoid assuming `R` is ordered, and includes the important case of a crystallographic pairing in characteristic zero. The cost of this is that various definitions and lemmas need to be generalised to allow room for the subring `S` (implemented using an injective `algebra S R` structure). In particular the definition `RootPairing.IsRootPositive` becomes `RootPairing.RootPositiveForm` and has its API substantially reworked. An alternative approach to the headline result (taken in the informal literature) is to invoke `RootPairing.restrictScalarsRat` but this only works with field coefficients and does not provide the same unifications. We also repair some doc strings (which did not have fully-qualified names, or had names which had drifted from the code).
1 parent 2dd5bb2 commit 79ad6ef

File tree

6 files changed

+272
-133
lines changed

6 files changed

+272
-133
lines changed

Mathlib/LinearAlgebra/BilinearMap.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,11 @@ noncomputable def restrictScalarsRange :
429429
k (restrictScalarsRange i j k hk B hB m n) = B (i m) (j n) := by
430430
simp [restrictScalarsRange]
431431

432+
@[simp]
433+
lemma eq_restrictScalarsRange_iff (m : M') (n : N') (p : P') :
434+
p = restrictScalarsRange i j k hk B hB m n ↔ k p = B (i m) (j n) := by
435+
rw [← restrictScalarsRange_apply i j k hk B hB m n, hk.eq_iff]
436+
432437
@[simp]
433438
lemma restrictScalarsRange_apply_eq_zero_iff (m : M') (n : N') :
434439
restrictScalarsRange i j k hk B hB m n = 0 ↔ B (i m) (j n) = 0 := by

Mathlib/LinearAlgebra/RootSystem/CartanMatrix.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ lemma cartanMatrixIn_def (i j : b.support) :
4343
b.cartanMatrixIn S i j = P.pairingIn S i j :=
4444
rfl
4545

46-
variable [Nontrivial R] [NoZeroSMulDivisors S R]
46+
variable [FaithfulSMul S R]
4747

4848
@[simp]
4949
lemma cartanMatrixIn_apply_same (i : b.support) :

Mathlib/LinearAlgebra/RootSystem/Defs.lean

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -406,9 +406,6 @@ lemma isValuedIn_iff_mem_range :
406406
P.IsValuedIn S ↔ ∀ i j, P.pairing i j ∈ range (algebraMap S R) := by
407407
simp only [isValuedIn_iff, mem_range]
408408

409-
instance : P.IsValuedIn R where
410-
exists_value := by simp
411-
412409
instance [P.IsValuedIn S] : P.flip.IsValuedIn S := by
413410
rw [isValuedIn_iff, forall_comm]
414411
exact P.exists_value
@@ -417,7 +414,7 @@ instance [P.IsValuedIn S] : P.flip.IsValuedIn S := by
417414
coefficients.
418415
419416
Note that it is uniquely-defined only when the map `S → R` is injective, i.e., when we have
420-
`[NoZeroSMulDivisors S R]`. -/
417+
`[FaithfulSMul S R]`. -/
421418
def pairingIn [P.IsValuedIn S] (i j : ι) : S :=
422419
(P.exists_value i j).choose
423420

@@ -426,13 +423,35 @@ lemma algebraMap_pairingIn [P.IsValuedIn S] (i j : ι) :
426423
algebraMap S R (P.pairingIn S i j) = P.pairing i j :=
427424
(P.exists_value i j).choose_spec
428425

426+
@[simp]
427+
lemma pairingIn_same [FaithfulSMul S R] [P.IsValuedIn S] (i : ι) :
428+
P.pairingIn S i i = 2 :=
429+
FaithfulSMul.algebraMap_injective S R <| by simp [map_ofNat]
430+
429431
lemma IsValuedIn.trans (T : Type*) [CommRing T] [Algebra T S] [Algebra T R] [IsScalarTower T S R]
430432
[P.IsValuedIn T] :
431433
P.IsValuedIn S where
432434
exists_value i j := by
433435
use algebraMap T S (P.pairingIn T i j)
434436
simp [← RingHom.comp_apply, ← IsScalarTower.algebraMap_eq T S R]
435437

438+
lemma coroot'_apply_apply_mem_of_mem_span [Module S M] [IsScalarTower S R M] [P.IsValuedIn S]
439+
{x : M} (hx : x ∈ span S (range P.root)) (i : ι) :
440+
P.coroot' i x ∈ range (algebraMap S R) := by
441+
rw [show range (algebraMap S R) = LinearMap.range (Algebra.linearMap S R) from rfl]
442+
induction hx using Submodule.span_induction with
443+
| mem x hx =>
444+
obtain ⟨k, rfl⟩ := hx
445+
simpa using RootPairing.exists_value k i
446+
| zero => simp
447+
| add x y _ _ hx hy => simpa only [map_add] using add_mem hx hy
448+
| smul t x _ hx => simpa only [LinearMap.map_smul_of_tower] using Submodule.smul_mem _ t hx
449+
450+
lemma root'_apply_apply_mem_of_mem_span [Module S N] [IsScalarTower S R N] [P.IsValuedIn S]
451+
{x : N} (hx : x ∈ span S (range P.coroot)) (i : ι) :
452+
P.root' i x ∈ LinearMap.range (Algebra.linearMap S R) :=
453+
P.flip.coroot'_apply_apply_mem_of_mem_span S hx i
454+
436455
end IsValuedIn
437456

438457
/-- A root pairing is said to be reduced if any linearly dependent pair of roots is related by a
@@ -582,7 +601,7 @@ lemma coxeterWeight_swap : coxeterWeight P i j = coxeterWeight P j i := by
582601
coefficients.
583602
584603
Note that it is uniquely-defined only when the map `S → R` is injective, i.e., when we have
585-
`[NoZeroSMulDivisors S R]`. -/
604+
`[FaithfulSMul S R]`. -/
586605
def coxeterWeightIn (S : Type*) [CommRing S] [Algebra S R] [P.IsValuedIn S] (i j : ι) : S :=
587606
P.pairingIn S i j * P.pairingIn S j i
588607

Mathlib/LinearAlgebra/RootSystem/Finite/CanonicalBilinear.lean

Lines changed: 89 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,20 @@ Another application is to the faithfulness of the Weyl group action on roots, an
1919
Weyl group.
2020
2121
## Main definitions:
22-
* `Polarization`: A distinguished linear map from the weight space to the coweight space.
23-
* `RootForm` : The bilinear form on weight space corresponding to `Polarization`.
22+
* `RootPairing.Polarization`: A distinguished linear map from the weight space to the coweight
23+
space.
24+
* `RootPairing.RootForm` : The bilinear form on weight space corresponding to `Polarization`.
2425
2526
## Main results:
26-
* `polarization_self_sum_of_squares` : The inner product of any weight vector is a sum of squares.
27-
* `rootForm_reflection_reflection_apply` : `RootForm` is invariant with respect
27+
* `RootPairing.rootForm_self_sum_of_squares` : The inner product of any
28+
weight vector is a sum of squares.
29+
* `RootPairing.rootForm_reflection_reflection_apply` : `RootForm` is invariant with respect
2830
to reflections.
29-
* `rootForm_self_smul_coroot`: The inner product of a root with itself times the
30-
corresponding coroot is equal to two times Polarization applied to the root.
31-
* `rootForm_self_non_neg`: `RootForm` is positive semidefinite.
31+
* `RootPairing.rootForm_self_smul_coroot`: The inner product of a root with itself
32+
times the corresponding coroot is equal to two times Polarization applied to the root.
33+
* `RootPairing.exists_ge_zero_eq_rootForm`: `RootForm` is positive semidefinite.
34+
* `RootPairing.coxeterWeight_mem_set_of_isCrystallographic`: the Coxeter weights belongs to the
35+
set `{0, 1, 2, 3, 4}`.
3236
3337
## References:
3438
* [N. Bourbaki, *Lie groups and Lie algebras. Chapters 4--6*][bourbaki1968]
@@ -37,8 +41,6 @@ Weyl group.
3741
## TODO (possibly in other files)
3842
* Weyl-invariance
3943
* Faithfulness of Weyl group action, and finiteness of Weyl group, for finite root systems.
40-
* Relation to Coxeter weight. In particular, positivity constraints for finite root pairings mean
41-
we restrict to weights between 0 and 4.
4244
-/
4345

4446
open Set Function
@@ -51,11 +53,13 @@ variable {ι R M N : Type*}
5153

5254
namespace RootPairing
5355

54-
section CommRing
55-
56-
variable [Fintype ι] [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N]
56+
variable [CommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N]
5757
(P : RootPairing ι R M N)
5858

59+
section Fintype
60+
61+
variable [Fintype ι]
62+
5963
instance : Module.Finite R P.rootSpan := Finite.span_of_finite R <| finite_range P.root
6064

6165
instance : Module.Finite R P.corootSpan := Finite.span_of_finite R <| finite_range P.coroot
@@ -166,6 +170,16 @@ lemma rootForm_self_smul_coroot (i : ι) :
166170
rw [Finset.sum_smul, add_neg_eq_zero.mpr rfl]
167171
exact sub_eq_zero_of_eq rfl
168172

173+
lemma corootForm_self_smul_root (i : ι) :
174+
(P.CorootForm (P.coroot i) (P.coroot i)) • P.root i = 2 • P.CoPolarization (P.coroot i) :=
175+
rootForm_self_smul_coroot (P.flip) i
176+
177+
lemma four_nsmul_coPolarization_compl_polarization_apply_root (i : ι) :
178+
(4 • P.CoPolarization ∘ₗ P.Polarization) (P.root i) =
179+
(P.RootForm (P.root i) (P.root i) * P.CorootForm (P.coroot i) (P.coroot i)) • P.root i := by
180+
rw [LinearMap.smul_apply, LinearMap.comp_apply, show 4 = 2 * 2 from rfl, mul_smul, ← map_nsmul,
181+
← rootForm_self_smul_coroot, map_smul, smul_comm, ← corootForm_self_smul_root, smul_smul]
182+
169183
lemma four_smul_rootForm_sq_eq_coxeterWeight_smul (i j : ι) :
170184
4 • (P.RootForm (P.root i) (P.root j)) ^ 2 = P.coxeterWeight i j •
171185
(P.RootForm (P.root i) (P.root i) * P.RootForm (P.root j) (P.root j)) := by
@@ -183,10 +197,6 @@ lemma four_smul_rootForm_sq_eq_coxeterWeight_smul (i j : ι) :
183197
map_smul, ← pairing, smul_eq_mul, smul_eq_mul, smul_eq_mul, coxeterWeight]
184198
ring
185199

186-
lemma corootForm_self_smul_root (i : ι) :
187-
(P.CorootForm (P.coroot i) (P.coroot i)) • P.root i = 2 • P.CoPolarization (P.coroot i) :=
188-
rootForm_self_smul_coroot (P.flip) i
189-
190200
lemma rootForm_self_sum_of_squares (x : M) :
191201
IsSumSq (P.RootForm x x) :=
192202
P.rootForm_apply_apply x x ▸ IsSumSq.sum_mul_self Finset.univ _
@@ -226,57 +236,86 @@ lemma prod_rootForm_smul_coroot_mem_range_domRestrict (i : ι) :
226236
use ⟨(c • 2 • P.root i), by aesop⟩
227237
simp
228238

229-
end CommRing
230-
231-
section LinearOrderedCommRing
239+
end Fintype
232240

233-
variable [Fintype ι] [LinearOrderedCommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N]
234-
[Module R N] (P : RootPairing ι R M N)
241+
section IsValuedInOrdered
235242

236-
theorem rootForm_self_non_neg (x : M) : 0 ≤ P.RootForm x x :=
237-
IsSumSq.nonneg (P.rootForm_self_sum_of_squares x)
243+
variable (S : Type*) [LinearOrderedCommRing S] [Algebra S R] [FaithfulSMul S R]
244+
[Module S M] [IsScalarTower S R M] [P.IsValuedIn S]
238245

239-
lemma rootForm_self_eq_zero_iff {x : M} :
240-
P.RootForm x x = 0 ↔ x ∈ LinearMap.ker P.RootForm :=
241-
P.RootForm.apply_apply_same_eq_zero_iff P.rootForm_self_non_neg P.rootForm_symmetric
242-
243-
lemma rootForm_root_self_pos (i : ι) :
244-
0 < P.RootForm (P.root i) (P.root i) := by
245-
simp only [rootForm_apply_apply]
246-
exact Finset.sum_pos' (fun j _ ↦ mul_self_nonneg _) ⟨i, by simp⟩
246+
/-- The bilinear form of a finite root pairing taking values in a linearly-ordered ring, as a
247+
root-positive form. -/
248+
def posRootForm [Fintype ι] : P.RootPositiveForm S where
249+
form := P.RootForm
250+
symm := P.rootForm_symmetric
251+
isOrthogonal_reflection := P.rootForm_reflection_reflection_apply
252+
exists_eq i j := ⟨∑ k, P.pairingIn S i k * P.pairingIn S j k, by simp [rootForm_apply_apply]⟩
253+
exists_pos_eq i := by
254+
refine ⟨∑ k, P.pairingIn S i k ^ 2, ?_, by simp [sq, rootForm_apply_apply]⟩
255+
exact Finset.sum_pos' (fun j _ ↦ sq_nonneg _) ⟨i, by simp⟩
256+
257+
theorem exists_ge_zero_eq_rootForm [Fintype ι] (x : M) (hx : x ∈ span S (range P.root)) :
258+
∃ s ≥ 0, algebraMap S R s = P.RootForm x x := by
259+
refine ⟨(P.posRootForm S).posForm ⟨x, hx⟩ ⟨x, hx⟩, IsSumSq.nonneg ?_, by simp [posRootForm]⟩
260+
choose s hs using P.coroot'_apply_apply_mem_of_mem_span S hx
261+
suffices (P.posRootForm S).posForm ⟨x, hx⟩ ⟨x, hx⟩ = ∑ i, s i * s i from
262+
this ▸ IsSumSq.sum_mul_self Finset.univ s
263+
apply FaithfulSMul.algebraMap_injective S R
264+
simp only [posRootForm, RootPositiveForm.algebraMap_posForm, map_sum, map_mul]
265+
simp [← Algebra.linearMap_apply, hs, rootForm_apply_apply]
247266

248267
/-- SGA3 XXI Prop. 2.3.1 -/
249-
lemma coxeterWeight_le_four (i j : ι) : P.coxeterWeight i j ≤ 4 := by
250-
set li := P.RootForm (P.root i) (P.root i)
251-
set lj := P.RootForm (P.root j) (P.root j)
252-
set lij := P.RootForm (P.root i) (P.root j)
253-
have hi := P.rootForm_root_self_pos i
254-
have hj := P.rootForm_root_self_pos j
268+
lemma coxeterWeightIn_le_four [Finite ι] (i j : ι) :
269+
P.coxeterWeightIn S i j ≤ 4 := by
270+
have : Fintype ι := Fintype.ofFinite ι
271+
let ri : span S (range P.root) := ⟨P.root i, Submodule.subset_span (mem_range_self _)⟩
272+
let rj : span S (range P.root) := ⟨P.root j, Submodule.subset_span (mem_range_self _)⟩
273+
set li := (P.posRootForm S).posForm ri ri
274+
set lj := (P.posRootForm S).posForm rj rj
275+
set lij := (P.posRootForm S).posForm ri rj
276+
obtain ⟨si, hsi, hsi'⟩ := (P.posRootForm S).exists_pos_eq i
277+
obtain ⟨sj, hsj, hsj'⟩ := (P.posRootForm S).exists_pos_eq j
278+
replace hsi' : si = li := FaithfulSMul.algebraMap_injective S R <| by simpa [li] using hsi'
279+
replace hsj' : sj = lj := FaithfulSMul.algebraMap_injective S R <| by simpa [lj] using hsj'
280+
rw [hsi'] at hsi
281+
rw [hsj'] at hsj
255282
have cs : 4 * lij ^ 24 * (li * lj) := by
256283
rw [mul_le_mul_left four_pos]
257-
exact LinearMap.BilinForm.apply_sq_le_of_symm P.RootForm P.rootForm_self_non_neg
258-
P.rootForm_symmetric (P.root i) (P.root j)
259-
have key : 4 • lij ^ 2 = _ • (li * lj) := P.four_smul_rootForm_sq_eq_coxeterWeight_smul i j
284+
refine (P.posRootForm S).posForm.apply_sq_le_of_symm ?_ (P.posRootForm S).isSymm_posForm ri rj
285+
intro x
286+
obtain ⟨s, hs, hs'⟩ := P.exists_ge_zero_eq_rootForm S x x.property
287+
change _ = (P.posRootForm S).form x x at hs'
288+
rw [(P.posRootForm S).algebraMap_apply_eq_form_iff] at hs'
289+
rwa [← hs']
290+
have key : 4 • lij ^ 2 = P.coxeterWeightIn S i j • (li * lj) := by
291+
apply FaithfulSMul.algebraMap_injective S R
292+
simpa [map_ofNat, lij, posRootForm, ri, rj, li, lj] using
293+
P.four_smul_rootForm_sq_eq_coxeterWeight_smul i j
260294
simp only [nsmul_eq_mul, smul_eq_mul, Nat.cast_ofNat] at key
261295
rwa [key, mul_le_mul_right (by positivity)] at cs
262296

263-
instance instIsRootPositiveRootForm : IsRootPositive P P.RootForm where
264-
zero_lt_apply_root i := P.rootForm_root_self_pos i
265-
symm := P.rootForm_symmetric
266-
apply_reflection_eq := P.rootForm_reflection_reflection_apply
297+
variable [Finite ι] [P.IsCrystallographic] [CharZero R] (i j : ι)
267298

268-
lemma coxeterWeight_mem_set_of_isCrystallographic (i j : ι) [P.IsCrystallographic] :
269-
P.coxeterWeight i j ∈ ({0, 1, 2, 3, 4} : Set R) := by
270-
obtain ⟨n, hcn⟩ : ∃ n : ℕ, P.coxeterWeight i j = n := by
299+
lemma coxeterWeightIn_mem_set_of_isCrystallographic :
300+
P.coxeterWeightIn ℤ i j ∈ ({0, 1, 2, 3, 4} : Set ℤ) := by
301+
have : Fintype ι := Fintype.ofFinite ι
302+
obtain ⟨n, hcn⟩ : ∃ n : ℕ, P.coxeterWeightIn ℤ i j = n := by
271303
have : 0 ≤ P.coxeterWeightIn ℤ i j := by
272-
simpa [← P.algebraMap_coxeterWeightIn] using P.coxeterWeight_non_neg P.RootForm i j
304+
simpa only [P.algebraMap_coxeterWeightIn] using P.coxeterWeight_nonneg (P.posRootForm ℤ) i j
273305
obtain ⟨n, hn⟩ := Int.eq_ofNat_of_zero_le this
274306
exact ⟨n, by simp [← P.algebraMap_coxeterWeightIn ℤ, hn]⟩
275-
have : P.coxeterWeight i j ≤ 4 := P.coxeterWeight_le_four i j
307+
have : P.coxeterWeightIn ℤ i j ≤ 4 := P.coxeterWeightIn_le_four ℤ i j
276308
simp only [hcn, mem_insert_iff, mem_singleton_iff] at this ⊢
277309
norm_cast at this ⊢
278310
omega
279311

280-
end LinearOrderedCommRing
312+
lemma coxeterWeight_mem_set_of_isCrystallographic :
313+
P.coxeterWeight i j ∈ ({0, 1, 2, 3, 4} : Set R) := by
314+
have := (FaithfulSMul.algebraMap_injective ℤ R).mem_set_image.mpr <|
315+
P.coxeterWeightIn_mem_set_of_isCrystallographic i j
316+
rw [algebraMap_coxeterWeightIn] at this
317+
simpa [eq_comm] using this
318+
319+
end IsValuedInOrdered
281320

282321
end RootPairing

Mathlib/LinearAlgebra/RootSystem/Finite/Nondegenerate.lean

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ Weyl group.
4242
## Todo
4343
* Weyl-invariance of `RootForm` and `CorootForm`
4444
* Faithfulness of Weyl group perm action, and finiteness of Weyl group, over ordered rings.
45-
* Relation to Coxeter weight. In particular, positivity constraints for finite root pairings mean
46-
we restrict to weights between 0 and 4.
45+
* Relation to Coxeter weight.
4746
-/
4847

4948
noncomputable section
@@ -74,24 +73,15 @@ instance [P.IsAnisotropic] : P.flip.IsAnisotropic where
7473
rootForm_root_ne_zero := IsAnisotropic.corootForm_coroot_ne_zero
7574
corootForm_coroot_ne_zero := IsAnisotropic.rootForm_root_ne_zero
7675

77-
/-- An auxiliary lemma en route to `RootPairing.instIsAnisotropicOfIsCrystallographic`. -/
78-
private lemma rootForm_root_ne_zero_aux [CharZero R] [P.IsCrystallographic] (i : ι) :
79-
P.RootForm (P.root i) (P.root i) ≠ 0 := by
80-
choose z hz using P.exists_value (S := ℤ) i
81-
simp_rw [algebraMap_int_eq, Int.coe_castRingHom] at hz
82-
simp only [rootForm_apply_apply, PerfectPairing.flip_apply_apply, root_coroot_eq_pairing, ← hz]
83-
suffices 0 < ∑ i, z i * z i by norm_cast; exact this.ne'
84-
refine Finset.sum_pos' (fun i _ ↦ mul_self_nonneg (z i)) ⟨i, Finset.mem_univ i, ?_⟩
85-
have hzi : z i = 2 := by
86-
specialize hz i
87-
rw [pairing_same] at hz
88-
norm_cast at hz
89-
simp [hzi]
76+
lemma isAnisotropic_of_isValuedIn (S : Type*)
77+
[LinearOrderedCommRing S] [Algebra S R] [FaithfulSMul S R] [P.IsValuedIn S] :
78+
IsAnisotropic P where
79+
rootForm_root_ne_zero i := (P.posRootForm S).form_apply_root_ne_zero i
80+
corootForm_coroot_ne_zero i := (P.flip.posRootForm S).form_apply_root_ne_zero i
9081

9182
instance instIsAnisotropicOfIsCrystallographic [CharZero R] [P.IsCrystallographic] :
92-
IsAnisotropic P where
93-
rootForm_root_ne_zero := P.rootForm_root_ne_zero_aux
94-
corootForm_coroot_ne_zero := P.flip.rootForm_root_ne_zero_aux
83+
IsAnisotropic P :=
84+
P.isAnisotropic_of_isValuedIn ℤ
9585

9686
end CommRing
9787

@@ -224,16 +214,23 @@ section LinearOrderedCommRing
224214

225215
variable [LinearOrderedCommRing R] [Module R M] [Module R N] (P : RootPairing ι R M N)
226216

227-
instance instIsAnisotropicOfLinearOrderedCommRing : IsAnisotropic P where
228-
rootForm_root_ne_zero i := (P.rootForm_root_self_pos i).ne'
229-
corootForm_coroot_ne_zero i := (P.flip.rootForm_root_self_pos i).ne'
217+
instance instIsAnisotropicOfLinearOrderedCommRing : IsAnisotropic P :=
218+
P.isAnisotropic_of_isValuedIn R
219+
220+
lemma zero_le_rootForm (x : M) :
221+
0 ≤ P.RootForm x x :=
222+
(P.rootForm_self_sum_of_squares x).nonneg
230223

231224
/-- See also `RootPairing.rootForm_restrict_nondegenerate_of_isAnisotropic`. -/
232225
lemma rootForm_restrict_nondegenerate_of_ordered :
233226
LinearMap.Nondegenerate (P.RootForm.restrict P.rootSpan) :=
234-
(P.RootForm.nondegenerate_restrict_iff_disjoint_ker (rootForm_self_non_neg P)
227+
(P.RootForm.nondegenerate_restrict_iff_disjoint_ker P.zero_le_rootForm
235228
P.rootForm_symmetric).mpr P.disjoint_rootSpan_ker_rootForm
236229

230+
lemma rootForm_self_eq_zero_iff {x : M} :
231+
P.RootForm x x = 0 ↔ x ∈ LinearMap.ker P.RootForm :=
232+
P.RootForm.apply_apply_same_eq_zero_iff P.zero_le_rootForm P.rootForm_symmetric
233+
237234
lemma eq_zero_of_mem_rootSpan_of_rootForm_self_eq_zero {x : M}
238235
(hx : x ∈ P.rootSpan) (hx' : P.RootForm x x = 0) :
239236
x = 0 := by
@@ -242,7 +239,7 @@ lemma eq_zero_of_mem_rootSpan_of_rootForm_self_eq_zero {x : M}
242239

243240
lemma rootForm_pos_of_ne_zero {x : M} (hx : x ∈ P.rootSpan) (h : x ≠ 0) :
244241
0 < P.RootForm x x := by
245-
apply (P.rootForm_self_non_neg x).lt_of_ne
242+
apply (P.zero_le_rootForm x).lt_of_ne
246243
contrapose! h
247244
exact P.eq_zero_of_mem_rootSpan_of_rootForm_self_eq_zero hx h.symm
248245

0 commit comments

Comments
 (0)