Skip to content

Commit 31b40b4

Browse files
committed
feat (LinearAlgebra/RootSystem/RootPositive) : Root-positive bilinear forms (#15155)
This PR introduces a Prop-valued mixin class for root pairings, specifying that a bilinear form on weight space is symmetric, reflection-invariant, and gives roots a strictly positive norm. Given a root-positive norm, one obtains sign-compatibilities between the form and the canonical pairing between roots and coroots. Root-positive forms show up naturally in Kac-Moody Lie algebras (without the name), and the canonical polarization on a finite root pairing induces a root-positive form.
1 parent ee1fbad commit 31b40b4

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2981,6 +2981,7 @@ import Mathlib.LinearAlgebra.Ray
29812981
import Mathlib.LinearAlgebra.Reflection
29822982
import Mathlib.LinearAlgebra.RootSystem.Basic
29832983
import Mathlib.LinearAlgebra.RootSystem.Defs
2984+
import Mathlib.LinearAlgebra.RootSystem.RootPositive
29842985
import Mathlib.LinearAlgebra.SModEq
29852986
import Mathlib.LinearAlgebra.Semisimple
29862987
import Mathlib.LinearAlgebra.SesquilinearForm
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/-
2+
Copyright (c) 2024 Scott Carnahan. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Scott Carnahan
5+
-/
6+
import Mathlib.LinearAlgebra.RootSystem.Defs
7+
8+
/-!
9+
# Root-positive bilinear forms on root pairings
10+
11+
This file contains basic results on Weyl-invariant inner products for root systems and root data.
12+
We introduce a Prop-valued mixin class for a root pairing and bilinear form, specifying
13+
reflection-invariance, symmetry, and strict positivity on all roots. We show that root-positive
14+
forms display the same sign behavior as the canonical pairing between roots and coroots.
15+
16+
Root-positive forms show up naturally as the invariant forms for symmetrizable Kac-Moody Lie
17+
algebras. In the finite case, the canonical polarization yields a root-positive form that is
18+
positive semi-definite on weight space and positive-definite on the span of roots.
19+
20+
## Main definitions:
21+
22+
* `IsRootPositive`: A prop-valued mixin class for root pairings with bilinear forms, specifying
23+
the form is symmetric, reflection-invariant, and all roots have strictly positive norm.
24+
25+
## Main results:
26+
27+
* `pairing_pos_iff` and `pairing_zero_iff` : sign relations between `P.pairing` and the form `B`.
28+
* `coxeter_weight_non_neg` : All pairs of roots have non-negative Coxeter weight.
29+
* `orthogonal_of_coxeter_weight_zero` : If Coxeter weight vanishes, then the roots are orthogonal.
30+
31+
## TODO
32+
33+
* Invariance under the Weyl group.
34+
35+
-/
36+
37+
noncomputable section
38+
39+
variable {ι R M N : Type*}
40+
41+
namespace RootPairing
42+
43+
variable [LinearOrderedCommRing R] [AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N]
44+
45+
/-- A Prop-valued class for a bilinear form to be compatible with a root pairing. -/
46+
class IsRootPositive (P : RootPairing ι R M N) (B : M →ₗ[R] M →ₗ[R] R) : Prop where
47+
zero_lt_apply_root : ∀ i, 0 < B (P.root i) (P.root i)
48+
symm : ∀ x y, B x y = B y x
49+
apply_reflection_eq : ∀ i x y, B (P.reflection i x) (P.reflection i y) = B x y
50+
51+
variable {P : RootPairing ι R M N} (B : M →ₗ[R] M →ₗ[R] R) [IsRootPositive P B] (i j : ι)
52+
53+
lemma two_mul_apply_root_root :
54+
2 * B (P.root i) (P.root j) = P.pairing i j * B (P.root j) (P.root j) := by
55+
rw [two_mul, ← eq_sub_iff_add_eq]
56+
nth_rw 1 [← IsRootPositive.apply_reflection_eq (P := P) (B := B) j (P.root i) (P.root j)]
57+
rw [reflection_apply, reflection_apply_self, root_coroot_eq_pairing, LinearMap.map_sub₂,
58+
LinearMap.map_smul₂, smul_eq_mul, LinearMap.map_neg, LinearMap.map_neg, mul_neg, neg_sub_neg]
59+
60+
@[simp]
61+
lemma zero_lt_apply_root_root_iff : 0 < B (P.root i) (P.root j) ↔ 0 < P.pairing i j := by
62+
refine ⟨fun h ↦ (mul_pos_iff_of_pos_right
63+
(IsRootPositive.zero_lt_apply_root (P := P) (B := B) j)).mp ?_,
64+
fun h ↦ (mul_pos_iff_of_pos_left zero_lt_two).mp ?_⟩
65+
· rw [← two_mul_apply_root_root]
66+
exact mul_pos zero_lt_two h
67+
· rw [two_mul_apply_root_root]
68+
exact mul_pos h (IsRootPositive.zero_lt_apply_root (P := P) (B := B) j)
69+
70+
lemma zero_lt_pairing_iff : 0 < P.pairing i j ↔ 0 < P.pairing j i := by
71+
rw [← zero_lt_apply_root_root_iff B, IsRootPositive.symm P, zero_lt_apply_root_root_iff]
72+
73+
lemma coxeterWeight_non_neg : 0 ≤ P.coxeterWeight i j := by
74+
dsimp [coxeterWeight]
75+
by_cases h : 0 < P.pairing i j
76+
· exact le_of_lt <| mul_pos h ((zero_lt_pairing_iff B i j).mp h)
77+
· have hn : ¬ 0 < P.pairing j i := fun hc ↦ h ((zero_lt_pairing_iff B i j).mpr hc)
78+
simp_all only [not_lt, ge_iff_le]
79+
exact mul_nonneg_of_nonpos_of_nonpos h hn
80+
81+
@[simp]
82+
lemma apply_root_root_zero_iff : B (P.root i) (P.root j) = 0 ↔ P.pairing i j = 0 := by
83+
refine ⟨fun hB => ?_, fun hP => ?_⟩
84+
· have h2 : 2 * (B (P.root i)) (P.root j) = 0 := mul_eq_zero_of_right 2 hB
85+
rw [two_mul_apply_root_root] at h2
86+
exact eq_zero_of_ne_zero_of_mul_right_eq_zero (IsRootPositive.zero_lt_apply_root j).ne' h2
87+
· have h2 : 2 * B (P.root i) (P.root j) = 0 := by rw [two_mul_apply_root_root, hP, zero_mul]
88+
exact (mul_eq_zero.mp h2).resolve_left two_ne_zero
89+
90+
lemma pairing_zero_iff : P.pairing i j = 0 ↔ P.pairing j i = 0 := by
91+
rw [← apply_root_root_zero_iff B, IsRootPositive.symm P, apply_root_root_zero_iff B]
92+
93+
lemma coxeterWeight_zero_iff_isOrthogonal : P.coxeterWeight i j = 0 ↔ P.IsOrthogonal i j := by
94+
rw [coxeterWeight, mul_eq_zero]
95+
refine ⟨fun h => ?_, fun h => Or.inl h.1
96+
rcases h with h | h
97+
· exact ⟨h, (pairing_zero_iff B i j).mp h⟩
98+
· exact ⟨(pairing_zero_iff B j i).mp h, h⟩
99+
100+
end RootPairing

0 commit comments

Comments
 (0)