@@ -3,10 +3,13 @@ Copyright (c) 2025 Oliver Nash. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Oliver Nash
5
5
-/
6
+ import Mathlib.Algebra.Lie.Matrix
6
7
import Mathlib.Algebra.Lie.OfAssociative
8
+ import Mathlib.Algebra.Lie.Semisimple.Lemmas
7
9
import Mathlib.Algebra.Lie.Sl2
8
10
import Mathlib.LinearAlgebra.RootSystem.CartanMatrix
9
11
import Mathlib.LinearAlgebra.RootSystem.GeckConstruction.Lemmas
12
+ import Mathlib.RingTheory.Finiteness.Nilpotent
10
13
11
14
/-!
12
15
# Geck's construction of a Lie algebra associated to a root system
@@ -64,7 +67,7 @@ namespace RootPairing.GeckConstruction
64
67
65
68
variable {ι R M N : Type *} [Finite ι] [CommRing R] [IsDomain R] [CharZero R]
66
69
[AddCommGroup M] [Module R M] [AddCommGroup N] [Module R N]
67
- {P : RootSystem ι R M N} [P.IsCrystallographic] {b : P.Base}
70
+ {P : RootPairing ι R M N} [P.IsCrystallographic] {b : P.Base}
68
71
69
72
/-- Part of an `sl₂` triple used in Geck's construction of a Lie algebra from a root system. -/
70
73
def e (i : b.support) :
@@ -117,7 +120,7 @@ variable {b}
117
120
attribute [local simp] Ring.lie_def Matrix.mul_apply Matrix.one_apply Matrix.diagonal_apply
118
121
119
122
omit [Finite ι] [IsDomain R] [CharZero R] [P.IsCrystallographic] in
120
- lemma ω_mul_ω [DecidableEq ι] [Fintype ι] :
123
+ @[simp] lemma ω_mul_ω [DecidableEq ι] [Fintype ι] :
121
124
ω b * ω b = 1 := by
122
125
ext (k | k) (l | l) <;>
123
126
simp [ω, -indexNeg_neg]
@@ -478,4 +481,115 @@ lemma lie_e_f_ne [P.IsNotG2] :
478
481
479
482
end lie_e_f_ne
480
483
484
+ variable [DecidableEq ι]
485
+
486
+ /-- An auxiliary lemma en route to `RootPairing.GeckConstruction.isNilpotent_e`. -/
487
+ private lemma isNilpotent_e_aux {j : ι} (n : ℕ) (h : letI _i := P.indexNeg; j ≠ -i) :
488
+ (e i ^ n).col (.inr j) = 0 ∨
489
+ ∃ (k : ι) (x : ℕ), P.root k = P.root j + n • P.root i ∧
490
+ (e i ^ n).col (.inr j) = x • Pi.single (.inr k) 1 := by
491
+ have _i : NoZeroSMulDivisors ℤ M := by have := P.reflexive_left; exact .int_of_charZero R M
492
+ letI _i := P.indexNeg
493
+ have aux (n : ℕ) : (e i ^ (n + 1 )).col (.inr j) = (e i).mulVec ((e i ^ n).col (.inr j)) := by
494
+ rw [pow_succ', ← Matrix.mulVec_single_one, ← Matrix.mulVec_mulVec]; simp
495
+ induction n with
496
+ | zero => exact Or.inr ⟨j, 1 , by simp, by ext; simp [Pi.single_apply]⟩
497
+ | succ n ih =>
498
+ rcases ih with hn | ⟨k, x, hk₁, hk₂⟩
499
+ · left; simp [aux, hn]
500
+ rw [aux, hk₂, Matrix.mulVec_smul]
501
+ have hki : k ≠ -i := by
502
+ rintro rfl
503
+ replace hk₁ : P.root (-j) = (n + 1 ) • P.root i := by
504
+ simp only [indexNeg_neg, root_reflectionPerm, reflection_apply_self, neg_eq_iff_add_eq_zero,
505
+ add_smul, one_smul] at hk₁ ⊢
506
+ rw [← hk₁]
507
+ module
508
+ rcases n.eq_zero_or_pos with rfl | hn
509
+ · apply h
510
+ rw [zero_add, one_smul, EmbeddingLike.apply_eq_iff_eq] at hk₁
511
+ simp [← hk₁, -indexNeg_neg]
512
+ · have _i : (n + 1 ).AtLeastTwo := ⟨by omega⟩
513
+ exact P.nsmul_notMem_range_root (n := n + 1 ) (i := i) ⟨-j, hk₁⟩
514
+ by_cases hij : P.root j + (n + 1 ) • P.root i ∈ range P.root
515
+ · obtain ⟨l, hl⟩ := hij
516
+ right
517
+ refine ⟨l, x * (P.chainBotCoeff i k + 1 ), hl, ?_⟩
518
+ ext (m | m)
519
+ · simp [e, -indexNeg_neg, hki]
520
+ · rcases eq_or_ne m l with rfl | hml
521
+ · replace hl : P.root m = P.root i + P.root k := by rw [hl, hk₁]; module
522
+ simp [e, -indexNeg_neg, hl, mul_add]
523
+ · replace hl : P.root m ≠ P.root i + P.root k :=
524
+ fun contra ↦ hml (P.root.injective <| by rw [hl, contra, hk₁]; module)
525
+ simp [e, -indexNeg_neg, hml, hl]
526
+ · left
527
+ ext (l | l)
528
+ · simp [e, -indexNeg_neg, hki]
529
+ · replace hij : P.root l ≠ P.root i + P.root k :=
530
+ fun contra ↦ hij ⟨l, by rw [contra, hk₁]; module⟩
531
+ simp [e, -indexNeg_neg, hij]
532
+
533
+ lemma isNilpotent_e :
534
+ IsNilpotent (e i) := by
535
+ classical
536
+ have _i : NoZeroSMulDivisors ℤ M := by have := P.reflexive_left; exact .int_of_charZero R M
537
+ letI _i := P.indexNeg
538
+ rw [Matrix.isNilpotent_iff_forall_col]
539
+ have case_inl (j : b.support) : (e i ^ 2 ).col (Sum.inl j) = 0 := by
540
+ ext (k | k)
541
+ · simp [e, sq, ne_neg P i, -indexNeg_neg]
542
+ · have aux : ∀ x : ι, x ∈ Finset.univ → ¬ (x = i ∧ P.root k = P.root i + P.root x) := by
543
+ suffices P.root k ≠ (2 : ℕ) • P.root i by simpa [two_smul]
544
+ exact fun contra ↦ P.nsmul_notMem_range_root (n := 2 ) (i := i) ⟨k, contra⟩
545
+ simp [e, sq, -indexNeg_neg, ← ite_and, Finset.sum_ite_of_false aux]
546
+ rintro (j | j)
547
+ · exact ⟨2 , case_inl j⟩
548
+ · by_cases hij : j = -i
549
+ · use 2 + 1
550
+ replace hij : (e i).col (Sum.inr j) = Pi.single (Sum.inl i) 1 := by
551
+ ext (k | k)
552
+ · simp [e, -indexNeg_neg, Pi.single_apply, hij]
553
+ · have hk : P.root k ≠ P.root i + P.root j := by simp [hij, P.ne_zero k]
554
+ simp [e, -indexNeg_neg, hk]
555
+ rw [pow_succ, ← Matrix.mulVec_single_one, ← Matrix.mulVec_mulVec]
556
+ simp [hij, case_inl i]
557
+ use P.chainTopCoeff i j + 1
558
+ rcases isNilpotent_e_aux i (P.chainTopCoeff i j + 1 ) hij with this | ⟨k, x, hk₁, -⟩
559
+ · assumption
560
+ exfalso
561
+ replace hk₁ : P.root j + (P.chainTopCoeff i j + 1 ) • P.root i ∈ range P.root := ⟨k, hk₁⟩
562
+ have hij' : LinearIndependent R ![P.root i, P.root j] := by
563
+ apply IsReduced.linearIndependent P ?_ ?_
564
+ · rintro rfl
565
+ apply P.nsmul_notMem_range_root (n := P.chainTopCoeff i i + 2 ) (i := i)
566
+ convert hk₁ using 1
567
+ module
568
+ · contrapose! hij
569
+ rw [root_eq_neg_iff] at hij
570
+ rw [hij, ← indexNeg_neg, neg_neg]
571
+ rw [root_add_nsmul_mem_range_iff_le_chainTopCoeff hij'] at hk₁
572
+ omega
573
+
574
+ lemma isNilpotent_f :
575
+ IsNilpotent (f i) := by
576
+ obtain ⟨n, hn⟩ := isNilpotent_e i
577
+ suffices (ω b) * (f i ^ n) = 0 from ⟨n, by simpa [← mul_assoc] using congr_arg (ω b * ·) this⟩
578
+ suffices (ω b) * (f i ^ n) = (e i ^ n) * (ω b) by simp [this, hn]
579
+ clear hn
580
+ induction n with
581
+ | zero => simp
582
+ | succ n ih => rw [pow_succ, pow_succ, ← mul_assoc, ih, mul_assoc, ω_mul_f, ← mul_assoc]
583
+
584
+ open LinearMap LieModule in
585
+ /-- This is the main result of lemma 4.1 from [ Geck ] (Geck2017). -/
586
+ lemma trace_toEnd_eq_zero (x : lieAlgebra b) :
587
+ trace R _ (toEnd R _ (b.support ⊕ ι → R) x) = 0 := by
588
+ obtain ⟨x, hx⟩ := x
589
+ suffices trace R _ x.toLin' = 0 by simpa
590
+ refine LieAlgebra.trace_toEnd_eq_zero ?_ hx
591
+ rintro - (⟨i, rfl⟩ | ⟨i, rfl⟩)
592
+ · simpa using isNilpotent_e i
593
+ · simpa using isNilpotent_f i
594
+
481
595
end RootPairing.GeckConstruction
0 commit comments