|
| 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