Skip to content

Commit 9706527

Browse files
committed
feat: the annihilator of the kernel of the trace form of a Lie module is contained in the span of its weights (#8739)
1 parent 9e9a528 commit 9706527

File tree

2 files changed

+34
-21
lines changed

2 files changed

+34
-21
lines changed

Mathlib/Algebra/Lie/Killing.lean

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,8 @@ lemma traceForm_eq_sum_weightSpaceOf [IsTriangularizable R L M] (z : L) :
242242
LinearMap.trace_eq_sum_trace_restrict' hds hfin hxy]
243243
exact Finset.sum_congr (by simp) (fun χ _ ↦ rfl)
244244

245-
-- In characteristic zero a stronger result holds (no `⊓ LieAlgebra.center K L`) TODO prove this!
245+
-- In characteristic zero (or even just `LinearWeights R L M`) a stronger result holds (no
246+
-- `⊓ LieAlgebra.center R L`) TODO prove this using `LieModule.traceForm_eq_sum_finrank_nsmul_mul`.
246247
lemma lowerCentralSeries_one_inf_center_le_ker_traceForm :
247248
lowerCentralSeries R L L 1 ⊓ LieAlgebra.center R L ≤ LinearMap.ker (traceForm R L M) := by
248249
/- Sketch of proof (due to Zassenhaus):
@@ -490,32 +491,33 @@ lemma LieModule.traceForm_eq_sum_finrank_nsmul_mul [LieAlgebra.IsNilpotent K L]
490491
LinearMap.trace_eq_sum_trace_restrict' hds hfin hxy]
491492
exact Finset.sum_congr (by simp) (fun χ _ ↦ traceForm_weightSpace_eq K L M χ x y)
492493

493-
@[simp]
494-
lemma LieModule.span_weight_eq_top_of_ker_traceForm_eq_bot [LieAlgebra.IsNilpotent K L]
495-
[LinearWeights K L M] [IsTriangularizable K L M] [FiniteDimensional K L]
496-
(h : LinearMap.ker (traceForm K L M) = ⊥) :
497-
span K (range (weight.toLinear K L M)) = ⊤ := by
494+
-- The reverse inclusion should also hold: TODO prove this!
495+
lemma LieModule.dualAnnihilator_ker_traceForm_le_span_weight [LieAlgebra.IsNilpotent K L]
496+
[LinearWeights K L M] [IsTriangularizable K L M] [FiniteDimensional K L] :
497+
(LinearMap.ker (traceForm K L M)).dualAnnihilator ≤ span K (range (weight.toLinear K L M)) := by
498+
intro g hg
499+
simp only [Submodule.mem_dualAnnihilator, LinearMap.mem_ker] at hg
498500
by_contra contra
499501
obtain ⟨f : Module.Dual K (Module.Dual K L), hf, hf'⟩ :=
500-
Module.exists_dual_map_eq_bot_of_lt_top K (lt_top_iff_ne_top.mpr contra) inferInstance
502+
Submodule.exists_dual_map_eq_bot_of_nmem contra inferInstance
501503
let x : L := (Module.evalEquiv K L).symm f
502504
replace hf' : ∀ χ ∈ weight K L M, χ x = 0 := by
503505
intro χ hχ
504506
change weight.toLinear K L M ⟨χ, hχ⟩ x = 0
505507
rw [Module.apply_evalEquiv_symm_apply, ← Submodule.mem_bot (R := K), ← hf', Submodule.mem_map]
506508
exact ⟨weight.toLinear K L M ⟨χ, hχ⟩, Submodule.subset_span (mem_range_self _), rfl⟩
507-
have hx : x ≠ 0 := (LinearEquiv.map_ne_zero_iff _).mpr hf
508-
apply hx
509-
rw [← Submodule.mem_bot (R := K), ← h, LinearMap.mem_ker]
509+
have hx : g x ≠ 0 := by simpa
510+
refine hx (hg _ ?_)
510511
ext y
511512
rw [LieModule.traceForm_eq_sum_finrank_nsmul_mul, LinearMap.zero_apply]
512513
exact Finset.sum_eq_zero fun χ hχ ↦ by simp [hf' χ hχ]
513514

514515
/-- Given a splitting Cartan subalgebra `H` of a finite-dimensional Lie algebra with non-singular
515516
Killing form, the corresponding roots span the dual space of `H`. -/
517+
@[simp]
516518
lemma LieAlgebra.IsKilling.span_weight_eq_top [FiniteDimensional K L] [IsKilling K L]
517519
(H : LieSubalgebra K L) [H.IsCartanSubalgebra] [IsTriangularizable K H L] :
518520
span K (range (weight.toLinear K H L)) = ⊤ := by
519-
simp
521+
simpa using LieModule.dualAnnihilator_ker_traceForm_le_span_weight K H L
520522

521523
end Field

Mathlib/LinearAlgebra/Dual.lean

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -585,16 +585,6 @@ theorem nontrivial_dual_iff :
585585
instance instNontrivialDual [Nontrivial V] : Nontrivial (Dual K V) :=
586586
(nontrivial_dual_iff K).mpr inferInstance
587587

588-
theorem exists_dual_map_eq_bot_of_lt_top {p : Submodule K V} (hp : p < ⊤) (hp' : Free K (V ⧸ p)) :
589-
∃ f : Dual K V, f ≠ 0 ∧ p.map f = ⊥ := by
590-
obtain ⟨f, g, h⟩ : Nontrivial (Dual K <| V ⧸ p) :=
591-
(nontrivial_dual_iff K).mpr <| Submodule.Quotient.nontrivial_of_lt_top p hp
592-
refine ⟨(f - g).comp p.mkQ, ?_, by simp [Submodule.map_comp]⟩
593-
replace h : f - g ≠ 0 := sub_ne_zero.mpr h
594-
contrapose! h
595-
refine Submodule.quot_hom_ext (f := f - g) (g := 0) fun v ↦ (?_ : (f - g).comp p.mkQ v = _)
596-
simp [h]
597-
598588
end
599589

600590
theorem dual_rank_eq [Module.Finite K V] :
@@ -703,6 +693,27 @@ end IsReflexive
703693

704694
end Module
705695

696+
namespace Submodule
697+
698+
open Module
699+
700+
variable {R M : Type*} [CommRing R] [AddCommGroup M] [Module R M] {p : Submodule R M}
701+
702+
theorem exists_dual_map_eq_bot_of_nmem {x : M} (hx : x ∉ p) (hp' : Free R (M ⧸ p)) :
703+
∃ f : Dual R M, f x ≠ 0 ∧ p.map f = ⊥ := by
704+
suffices ∃ f : Dual R (M ⧸ p), f (p.mkQ x) ≠ 0 by
705+
obtain ⟨f, hf⟩ := this; exact ⟨f.comp p.mkQ, hf, by simp [Submodule.map_comp]⟩
706+
rwa [← Submodule.Quotient.mk_eq_zero, ← Submodule.mkQ_apply,
707+
← forall_dual_apply_eq_zero_iff (K := R), not_forall] at hx
708+
709+
theorem exists_dual_map_eq_bot_of_lt_top (hp : p < ⊤) (hp' : Free R (M ⧸ p)) :
710+
∃ f : Dual R M, f ≠ 0 ∧ p.map f = ⊥ := by
711+
obtain ⟨x, hx⟩ : ∃ x : M, x ∉ p := by rw [lt_top_iff_ne_top] at hp; contrapose! hp; ext; simp [hp]
712+
obtain ⟨f, hf, hf'⟩ := p.exists_dual_map_eq_bot_of_nmem hx hp'
713+
exact ⟨f, by aesop, hf'⟩
714+
715+
end Submodule
716+
706717
section DualBases
707718

708719
open Module

0 commit comments

Comments
 (0)