Skip to content

Commit 9c5f0d6

Browse files
committed
feat: define the sl₂ Lie subalgebra associated to a root (#24995)
The lemma `root_mem_submodule_iff_of_add_mem_invtSubmodule` is related in the sense that it can be used to prove the subalgebra associated to the roots in an invariant submodule is an ideal.
1 parent e89beeb commit 9c5f0d6

File tree

4 files changed

+165
-48
lines changed

4 files changed

+165
-48
lines changed

Mathlib/Algebra/Lie/Sl2.lean

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,51 @@ lemma HasPrimitiveVectorWith.mk' [NoZeroSMulDivisors ℤ M] (t : IsSl2Triple h e
9191
rw [← nsmul_lie, ← t.lie_h_e_nsmul, lie_lie, hm', lie_smul, he, lie_smul, hm',
9292
smul_smul, smul_smul, mul_comm ρ μ, sub_self]
9393

94+
variable (R) in
95+
open Submodule in
96+
/-- The subalgebra associated to an `sl₂` triple. -/
97+
def toLieSubalgebra (t : IsSl2Triple h e f) :
98+
LieSubalgebra R L where
99+
__ := span R {e, f, h}
100+
lie_mem' {x y} hx hy := by
101+
simp only [carrier_eq_coe, SetLike.mem_coe] at hx hy ⊢
102+
induction hx using span_induction with
103+
| zero => simp
104+
| add u v hu hv hu' hv' => simpa only [add_lie] using add_mem hu' hv'
105+
| smul t u hu hu' => simpa only [smul_lie] using smul_mem _ t hu'
106+
| mem u hu =>
107+
induction hy using span_induction with
108+
| zero => simp
109+
| add u v hu hv hu' hv' => simpa only [lie_add] using add_mem hu' hv'
110+
| smul t u hv hv' => simpa only [lie_smul] using smul_mem _ t hv'
111+
| mem v hv =>
112+
simp only [mem_insert_iff, mem_singleton_iff] at hu hv
113+
rcases hu with rfl | rfl | rfl <;>
114+
rcases hv with rfl | rfl | rfl <;> (try simp only [lie_self, zero_mem])
115+
· rw [t.lie_e_f]
116+
apply subset_span
117+
simp
118+
· rw [← lie_skew, t.lie_h_e_nsmul, neg_mem_iff]
119+
apply nsmul_mem <| subset_span _
120+
simp
121+
· rw [← lie_skew, t.lie_e_f, neg_mem_iff]
122+
apply subset_span
123+
simp
124+
· rw [← lie_skew, t.lie_h_f_nsmul, neg_neg]
125+
apply nsmul_mem <| subset_span _
126+
simp
127+
· rw [t.lie_h_e_nsmul]
128+
apply nsmul_mem <| subset_span _
129+
simp
130+
· rw [t.lie_h_f_nsmul, neg_mem_iff]
131+
apply nsmul_mem <| subset_span _
132+
simp
133+
134+
lemma mem_toLieSubalgebra_iff {x : L} {t : IsSl2Triple h e f} :
135+
x ∈ t.toLieSubalgebra R ↔ ∃ c₁ c₂ c₃ : R, x = c₁ • e + c₂ • f + c₃ • ⁅e, f⁆ := by
136+
simp_rw [t.lie_e_f, toLieSubalgebra, ← LieSubalgebra.mem_toSubmodule, Submodule.mem_span_triple,
137+
eq_comm]
138+
94139
namespace HasPrimitiveVectorWith
95140

96141
variable {m : M} {μ : R} {t : IsSl2Triple h e f}

Mathlib/Algebra/Lie/Weights/Killing.lean

Lines changed: 87 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,58 @@ lemma mem_ker_killingForm_of_mem_rootSpace_of_forall_rootSpace_neg
135135
| add => simp_all
136136
end
137137

138+
end Field
139+
140+
end LieAlgebra
141+
142+
namespace LieModule
143+
144+
namespace Weight
145+
146+
open LieAlgebra IsKilling
147+
148+
variable {K L}
149+
150+
variable [FiniteDimensional K L] [IsKilling K L]
151+
{H : LieSubalgebra K L} [H.IsCartanSubalgebra] [IsTriangularizable K H L] {α : Weight K H L}
152+
153+
instance : InvolutiveNeg (Weight K H L) where
154+
neg α := ⟨-α, by
155+
by_cases hα : α.IsZero
156+
· convert α.genWeightSpace_ne_bot; rw [hα, neg_zero]
157+
· intro e
158+
obtain ⟨x, hx, x_ne0⟩ := α.exists_ne_zero
159+
have := mem_ker_killingForm_of_mem_rootSpace_of_forall_rootSpace_neg K L H hx
160+
(fun y hy ↦ by rw [rootSpace, e] at hy; rw [hy, map_zero])
161+
rw [ker_killingForm_eq_bot] at this
162+
exact x_ne0 this⟩
163+
neg_neg α := by ext; simp
164+
165+
@[simp] lemma coe_neg : ((-α : Weight K H L) : H → K) = -α := rfl
166+
167+
lemma IsZero.neg (h : α.IsZero) : (-α).IsZero := by ext; rw [coe_neg, h, neg_zero]
168+
169+
@[simp] lemma isZero_neg : (-α).IsZero ↔ α.IsZero := ⟨fun h ↦ neg_neg α ▸ h.neg, fun h ↦ h.neg⟩
170+
171+
lemma IsNonZero.neg (h : α.IsNonZero) : (-α).IsNonZero := fun e ↦ h (by simpa using e.neg)
172+
173+
@[simp] lemma isNonZero_neg {α : Weight K H L} : (-α).IsNonZero ↔ α.IsNonZero := isZero_neg.not
174+
175+
@[simp] lemma toLinear_neg {α : Weight K H L} : (-α).toLinear = -α.toLinear := rfl
176+
177+
end Weight
178+
179+
end LieModule
180+
181+
namespace LieAlgebra
182+
183+
open Module LieModule Set
184+
open Submodule renaming span → span
185+
open Submodule renaming subset_span → subset_span
186+
138187
namespace IsKilling
139188

189+
variable [FiniteDimensional K L] (H : LieSubalgebra K L) [H.IsCartanSubalgebra]
140190
variable [IsKilling K L]
141191

142192
/-- If a Lie algebra `L` has non-degenerate Killing form, the only element of a Cartan subalgebra
@@ -188,6 +238,10 @@ lemma traceForm_coroot (α : Weight K H L) (x : H) :
188238
rw [coroot, map_nsmul, map_smul, LinearMap.smul_apply, LinearMap.smul_apply]
189239
congr 2
190240

241+
@[simp] lemma coroot_neg [IsTriangularizable K H L] (α : Weight K H L) :
242+
coroot (-α) = -coroot α := by
243+
simp [coroot]
244+
191245
variable [IsTriangularizable K H L]
192246

193247
lemma lie_eq_killingForm_smul_of_mem_rootSpace_of_mem_rootSpace_neg_aux
@@ -557,6 +611,39 @@ lemma finrank_rootSpace_eq_one (α : Weight K H L) (hα : α.IsNonZero) :
557611
replace hn : -2 = (n : ℤ) := by norm_cast at hn
558612
omega
559613

614+
/-- The embedded `sl₂` associated to a root. -/
615+
noncomputable def sl2SubalgebraOfRoot {α : Weight K H L} (hα : α.IsNonZero) :
616+
LieSubalgebra K L := by
617+
choose h e f t ht using exists_isSl2Triple_of_weight_isNonZero hα
618+
exact t.toLieSubalgebra K
619+
620+
lemma mem_sl2SubalgebraOfRoot_iff {α : Weight K H L} (hα : α.IsNonZero) {h e f : L}
621+
(t : IsSl2Triple h e f) (hte : e ∈ rootSpace H α) (htf : f ∈ rootSpace H (- α)) {x : L} :
622+
x ∈ sl2SubalgebraOfRoot hα ↔ ∃ c₁ c₂ c₃ : K, x = c₁ • e + c₂ • f + c₃ • ⁅e, f⁆ := by
623+
simp only [sl2SubalgebraOfRoot, IsSl2Triple.mem_toLieSubalgebra_iff]
624+
generalize_proofs _ _ _ he hf
625+
obtain ⟨ce, hce⟩ : ∃ c : K, he.choose = c • e := by
626+
obtain ⟨c, hc⟩ := (finrank_eq_one_iff_of_nonzero' ⟨e, hte⟩ (by simpa using t.e_ne_zero)).mp
627+
(finrank_rootSpace_eq_one α hα) ⟨_, he.choose_spec.choose_spec.2.1
628+
exact ⟨c, by simpa using hc.symm⟩
629+
obtain ⟨cf, hcf⟩ : ∃ c : K, hf.choose = c • f := by
630+
obtain ⟨c, hc⟩ := (finrank_eq_one_iff_of_nonzero' ⟨f, htf⟩ (by simpa using t.f_ne_zero)).mp
631+
(finrank_rootSpace_eq_one (-α) (by simpa)) ⟨_, hf.choose_spec.2.2
632+
exact ⟨c, by simpa using hc.symm⟩
633+
have hce₀ : ce ≠ 0 := by
634+
rintro rfl
635+
simp only [zero_smul] at hce
636+
exact he.choose_spec.choose_spec.1.e_ne_zero hce
637+
have hcf₀ : cf ≠ 0 := by
638+
rintro rfl
639+
simp only [zero_smul] at hcf
640+
exact he.choose_spec.choose_spec.1.f_ne_zero hcf
641+
simp_rw [hcf, hce]
642+
refine ⟨fun ⟨c₁, c₂, c₃, hx⟩ ↦ ⟨c₁ * ce, c₂ * cf, c₃ * cf * ce, ?_⟩,
643+
fun ⟨c₁, c₂, c₃, hx⟩ ↦ ⟨c₁ * ce⁻¹, c₂ * cf⁻¹, c₃ * ce⁻¹ * cf⁻¹, ?_⟩⟩
644+
· simp [hx, mul_smul]
645+
· simp [hx, mul_smul, hce₀, hcf₀]
646+
560647
/-- The collection of roots as a `Finset`. -/
561648
noncomputable abbrev _root_.LieSubalgebra.root : Finset (Weight K H L) := {α | α.IsNonZero}
562649

@@ -571,52 +658,4 @@ end CharZero
571658

572659
end IsKilling
573660

574-
end Field
575-
576661
end LieAlgebra
577-
578-
namespace LieModule
579-
580-
namespace Weight
581-
582-
open LieAlgebra IsKilling
583-
584-
variable {K L}
585-
586-
variable [FiniteDimensional K L]
587-
variable [IsKilling K L] {H : LieSubalgebra K L} [H.IsCartanSubalgebra] [IsTriangularizable K H L]
588-
variable {α : Weight K H L}
589-
590-
instance : InvolutiveNeg (Weight K H L) where
591-
neg α := ⟨-α, by
592-
by_cases hα : α.IsZero
593-
· convert α.genWeightSpace_ne_bot; rw [hα, neg_zero]
594-
· intro e
595-
obtain ⟨x, hx, x_ne0⟩ := α.exists_ne_zero
596-
have := mem_ker_killingForm_of_mem_rootSpace_of_forall_rootSpace_neg K L H hx
597-
(fun y hy ↦ by rw [rootSpace, e] at hy; rw [hy, map_zero])
598-
rw [ker_killingForm_eq_bot] at this
599-
exact x_ne0 this⟩
600-
neg_neg α := by ext; simp
601-
602-
@[simp] lemma coe_neg : ((-α : Weight K H L) : H → K) = -α := rfl
603-
604-
lemma IsZero.neg (h : α.IsZero) : (-α).IsZero := by ext; rw [coe_neg, h, neg_zero]
605-
606-
@[simp] lemma isZero_neg : (-α).IsZero ↔ α.IsZero := ⟨fun h ↦ neg_neg α ▸ h.neg, fun h ↦ h.neg⟩
607-
608-
lemma IsNonZero.neg (h : α.IsNonZero) : (-α).IsNonZero := fun e ↦ h (by simpa using e.neg)
609-
610-
@[simp] lemma isNonZero_neg {α : Weight K H L} : (-α).IsNonZero ↔ α.IsNonZero := isZero_neg.not
611-
612-
@[simp] lemma toLinear_neg {α : Weight K H L} : (-α).toLinear = -α.toLinear := rfl
613-
614-
variable [CharZero K]
615-
616-
@[simp]
617-
lemma _root_.LieAlgebra.IsKilling.coroot_neg (α : Weight K H L) : coroot (-α) = -coroot α := by
618-
simp [coroot]
619-
620-
end Weight
621-
622-
end LieModule

Mathlib/LinearAlgebra/RootSystem/Finite/Lemmas.lean

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,29 @@ lemma root_add_root_mem_of_pairingIn_neg (h : P.pairingIn ℤ i j < 0) (h' : α
231231
replace h' : i ≠ -j := by contrapose! h'; simp [h']
232232
simpa using P.root_sub_root_mem_of_pairingIn_pos h h'
233233

234+
omit [Finite ι] in
235+
lemma root_mem_submodule_iff_of_add_mem_invtSubmodule
236+
{K : Type*} [Field K] [NeZero (2 : K)] [Module K M] [Module K N] {P : RootPairing ι K M N}
237+
(q : P.invtRootSubmodule)
238+
(hij : P.root i + P.root j ∈ range P.root) :
239+
P.root i ∈ (q : Submodule K M) ↔ P.root j ∈ (q : Submodule K M) := by
240+
obtain ⟨q, hq⟩ := q
241+
rw [mem_invtRootSubmodule_iff] at hq
242+
suffices ∀ i j, P.root i + P.root j ∈ range P.root → P.root i ∈ q → P.root j ∈ q by
243+
have aux := this j i (by rwa [add_comm]); tauto
244+
rintro i j ⟨k, hk⟩ hi
245+
rcases eq_or_ne (P.pairing i j) 0 with hij₀ | hij₀
246+
· have hik : P.pairing i k ≠ 0 := by
247+
rw [ne_eq, P.pairing_eq_zero_iff, ← root_coroot_eq_pairing, hk]
248+
simpa [P.pairing_eq_zero_iff.mp hij₀] using two_ne_zero
249+
suffices P.root k ∈ q from (q.add_mem_iff_right hi).mp <| hk ▸ this
250+
replace hq : P.root i - P.pairing i k • P.root k ∈ q := by
251+
simpa [reflection_apply_root] using hq k hi
252+
rwa [q.sub_mem_iff_right hi, q.smul_mem_iff hik] at hq
253+
· replace hq : P.root i - P.pairing i j • P.root j ∈ q := by
254+
simpa [reflection_apply_root] using hq j hi
255+
rwa [q.sub_mem_iff_right hi, q.smul_mem_iff hij₀] at hq
256+
234257
namespace InvariantForm
235258

236259
variable [P.IsReduced] (B : P.InvariantForm)

Mathlib/LinearAlgebra/Span/Defs.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,16 @@ theorem mem_span_pair {x y z : M} :
450450
z ∈ span R ({x, y} : Set M) ↔ ∃ a b : R, a • x + b • y = z := by
451451
simp_rw [mem_span_insert, mem_span_singleton, exists_exists_eq_and, eq_comm]
452452

453+
theorem mem_span_triple {w x y z : M} :
454+
w ∈ span R ({x, y, z} : Set M) ↔ ∃ a b c : R, a • x + b • y + c • z = w := by
455+
rw [mem_span_insert]
456+
simp_rw [mem_span_pair]
457+
refine exists_congr fun a ↦ ⟨?_, ?_⟩
458+
· rintro ⟨u, ⟨b, c, rfl⟩, rfl⟩
459+
exact ⟨b, c, by rw [add_assoc]⟩
460+
· rintro ⟨b, c, rfl⟩
461+
exact ⟨b • y + c • z, ⟨b, c, rfl⟩, by rw [add_assoc]⟩
462+
453463
@[simp]
454464
theorem span_eq_bot : span R (s : Set M) = ⊥ ↔ ∀ x ∈ s, (x : M) = 0 :=
455465
eq_bot_iff.trans

0 commit comments

Comments
 (0)