Skip to content

Commit e885514

Browse files
jano-wolocfnash
andcommitted
feat: order isomorphism between ideals and invariant root submodules (#37285)
Order isomorphism between ideals and invariant root submodules Co-authored-by: Janos Wolosz <janos.wolosz@gmail.com> Co-authored-by: Oliver Nash <github@olivernash.org>
1 parent c00fe67 commit e885514

File tree

4 files changed

+87
-83
lines changed

4 files changed

+87
-83
lines changed

Mathlib/Algebra/Lie/Killing.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,16 @@ instance instHasTrivialRadical
9898
HasTrivialRadical R L :=
9999
(hasTrivialRadical_iff_no_abelian_ideals R L).mpr IsKilling.ideal_eq_bot_of_isLieAbelian
100100

101+
theorem isLieAbelian_iff_subsingleton
102+
[Module.Free R L] [Module.Finite R L] [IsDomain R] [IsPrincipalIdealRing R] :
103+
IsLieAbelian L ↔ Subsingleton L := by
104+
constructor
105+
· intro h
106+
rw [isLieAbelian_iff_center_eq_top R] at h
107+
have hc : (⊤ : LieIdeal R L) = ⊥ := by rw [← center_eq_bot R L, h]
108+
exact (LieSubmodule.subsingleton_iff R L L).mp (subsingleton_of_top_eq_bot hc)
109+
· exact fun _ => inferInstance
110+
101111
end IsKilling
102112

103113
section LieEquiv

Mathlib/Algebra/Lie/Semisimple/Basic.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,15 @@ instance : HasTrivialRadical R L := by
108108

109109
end IsSimple
110110

111+
lemma isSimple_iff_of_not_isLieAbelian (hL : ¬ IsLieAbelian L) :
112+
IsSimpleOrder (LieIdeal R L) ↔ IsSimple R L :=
113+
fun _ ↦ ⟨IsSimpleOrder.eq_bot_or_eq_top, hL⟩, fun _ ↦ inferInstance⟩
114+
115+
@[nontriviality]
116+
lemma not_isSimple_of_subsingleton [Subsingleton L] :
117+
¬ IsSimple R L :=
118+
fun contra ↦ contra.non_abelian inferInstance
119+
111120
namespace IsSemisimple
112121

113122
open CompleteLattice IsCompactlyGenerated

Mathlib/Algebra/Lie/Weights/IsSimple.lean

Lines changed: 63 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,20 @@ Weyl-group-invariant submodules of the corresponding root system. In this file w
1717
and `LieAlgebra.IsKilling.invtSubmoduleToLieIdeal`, which constructs the ideal associated to an
1818
invariant submodule.
1919
20-
As of Mar 2026, the proofs that these maps are part of an order isomorphism is still pending.
21-
2220
## Main definitions
2321
* `LieIdeal.rootSet`: the set of roots whose root space is contained in a given Lie ideal.
2422
* `LieIdeal.rootSpan`: the submodule of `Dual K H` spanned by `LieIdeal.rootSet`.
2523
* `LieIdeal.toInvtRootSubmodule`: the invariant root submodule associated to an ideal.
2624
* `LieAlgebra.IsKilling.invtSubmoduleToLieIdeal`: constructs a Lie ideal from an invariant
27-
submodule of the dual space
25+
submodule of the dual space.
26+
* `LieAlgebra.IsKilling.lieIdealOrderIso`: the order isomorphism between Lie ideals and
27+
invariant root submodules.
2828
2929
## Main results
3030
* `LieAlgebra.IsKilling.restr_inf_cartan_eq_iSup_corootSubmodule`: the intersection of a Lie ideal
3131
and a Cartan subalgebra is the span of the coroots whose roots have root spaces in the ideal.
32-
* `LieAlgebra.IsKilling.instIsIrreducible`: the root system of a simple Lie algebra is irreducible
32+
* `LieAlgebra.IsKilling.isSimple_iff_isIrreducible`: a Killing Lie algebra is simple if and only
33+
if its root system is irreducible.
3334
-/
3435

3536
@[expose] public section
@@ -500,84 +501,63 @@ lemma mem_rootSet_invtSubmoduleToLieIdeal (q : Submodule K (Dual K H))
500501
le_iSup_of_le ⟨↑α, hα, H.isNonZero_coe_root α⟩ le_rfl
501502
_ = J.restr H := (restr_invtSubmoduleToLieIdeal_eq_iSup q hq).symm
502503

503-
open LieSubmodule in
504-
@[simp] lemma invtSubmoduleToLieIdeal_top :
505-
invtSubmoduleToLieIdeal (⊤ : Submodule K (Module.Dual K H)) (by simp) = ⊤ := by
506-
simp_rw [← toSubmodule_inj, coe_invtSubmoduleToLieIdeal_eq_iSup, iSup_toSubmodule,
507-
top_toSubmodule, iSup_toSubmodule_eq_top, eq_top_iff, ← cartan_sup_iSup_rootSpace_eq_top H,
508-
iSup_subtype, Submodule.mem_top, true_and, sup_le_iff, iSup_le_iff, sl2SubmoduleOfRoot_eq_sup]
509-
refine ⟨?_, fun α hα ↦ le_iSup₂_of_le α hα <| le_sup_of_le_left <| le_sup_of_le_left <| le_refl _⟩
510-
suffices H.toLieSubmodule ≤ ⨆ α : Weight K H L, ⨆ (_ : α.IsNonZero), corootSubmodule α from
511-
this.trans <| iSup₂_mono fun α hα ↦ le_sup_right
512-
simp
513-
514-
@[simp] lemma invtSubmoduleToLieIdeal_apply_eq_top_iff (q : Submodule K (Dual K H))
515-
(hq : ∀ i, q ∈ End.invtSubmodule ((rootSystem H).reflection i).toLinearMap) :
516-
invtSubmoduleToLieIdeal q hq = ⊤ ↔ q = ⊤ := by
517-
refine ⟨fun h ↦ ?_, fun h ↦ by simp [h]⟩
518-
have h : (⨆ α : {α : Weight K H L // ↑α ∈ q ∧ α.IsNonZero}, sl2SubmoduleOfRoot α.2.2) = ⊤ := by
519-
rw [← LieSubmodule.toSubmodule_inj] at h
520-
have := coe_invtSubmoduleToLieIdeal_eq_iSup q hq
521-
exact (LieSubmodule.toSubmodule_eq_top (⨆ α, sl2SubmoduleOfRoot α.property.right)).mp h
522-
by_contra hq_ne_top
523-
have h_ne_bot : q.dualCoannihilator ≠ ⊥ := by
524-
contrapose! hq_ne_top
525-
have := Subspace.finrank_add_finrank_dualCoannihilator_eq q
526-
rw [hq_ne_top, finrank_bot, add_zero] at this
527-
exact Submodule.eq_top_of_finrank_eq (this.trans Subspace.dual_finrank_eq.symm)
528-
obtain ⟨y, hy_mem, hy_ne_zero⟩ := Submodule.exists_mem_ne_zero_of_ne_bot h_ne_bot
529-
have hy_ortho : ∀ f ∈ q, f y = 0 := (Submodule.mem_dualCoannihilator y).mp hy_mem
530-
have h_comm : ∀ α : {α : Weight K H L // ↑α ∈ q ∧ α.IsNonZero},
531-
∀ z ∈ sl2SubmoduleOfRoot α.2.2, ⁅(y : L), z⁆ = 0 := fun α z hz => by
532-
have hy : (α.1 : H → K) y = 0 := hy_ortho _ α.2.1
533-
rw [sl2SubmoduleOfRoot_eq_sup] at hz
534-
obtain ⟨z_αneg, hz_αneg, z_cor, ⟨h_cor, _, rfl⟩, rfl⟩ := Submodule.mem_sup.mp hz
535-
obtain ⟨z_α, hz_α, z_negα, hz_negα, rfl⟩ := Submodule.mem_sup.mp hz_αneg
536-
simp only [lie_add, ← LieSubalgebra.coe_bracket_of_module]
537-
rw [lie_eq_smul_of_mem_rootSpace hz_α, hy, zero_smul, zero_add,
538-
lie_eq_smul_of_mem_rootSpace hz_negα, Pi.neg_apply, hy, neg_zero, zero_smul, zero_add]
539-
have h_cor_in_zero : (h_cor : L) ∈ rootSpace H (0 : H → K) := by
540-
rw [rootSpace_zero_eq]; exact h_cor.property
541-
convert lie_eq_smul_of_mem_rootSpace h_cor_in_zero y using 1; simp
542-
have h_comm_all : ∀ z : L, ⁅(y : L), z⁆ = 0 := fun z => by
543-
have hz : z ∈ ⨆ α : {α : Weight K H L // ↑α ∈ q ∧ α.IsNonZero},
544-
(sl2SubmoduleOfRoot α.2.2).toSubmodule := by
545-
convert Submodule.mem_top using 1
546-
rw [← LieSubmodule.iSup_toSubmodule, h]; rfl
547-
rw [Submodule.mem_iSup] at hz
548-
exact hz (LinearMap.ker (ad K L y)) fun α z hz => by simpa using h_comm α z hz
549-
have h_y_center : (y : L) ∈ LieAlgebra.center K L := fun z => by
550-
rw [← lie_skew, h_comm_all, neg_zero]
551-
simp only [center_eq_bot, LieSubmodule.mem_bot, ZeroMemClass.coe_eq_zero] at h_y_center
552-
exact hy_ne_zero h_y_center
553-
554-
@[simp] lemma invtSubmoduleToLieIdeal_apply_eq_bot_iff (q : Submodule K (Module.Dual K H))
555-
(hq : ∀ i, q ∈ Module.End.invtSubmodule ((rootSystem H).reflection i).toLinearMap) :
556-
invtSubmoduleToLieIdeal q hq = ⊥ ↔ q = ⊥ := by
557-
refine ⟨fun h => ?_, fun h => ?_⟩
558-
· by_contra hq_nonzero
559-
have hq_invt : q ∈ (rootSystem H).invtRootSubmodule := by
560-
rw [RootPairing.mem_invtRootSubmodule_iff]; exact hq
561-
have h_ne_bot : (⟨q, hq_invt⟩ : (rootSystem H).invtRootSubmodule) ≠ ⊥ :=
562-
fun h_eq => hq_nonzero (Subtype.ext_iff.mp h_eq)
563-
rw [Ne, RootPairing.invtRootSubmodule.eq_bot_iff, not_forall] at h_ne_bot
564-
obtain ⟨i, hi⟩ := h_ne_bot
565-
rw [not_not] at hi
566-
have hα₀ : i.val.IsNonZero := (Finset.mem_filter.mp i.property).2
567-
have h_sl2_le : (sl2SubmoduleOfRoot hα₀ : Submodule K L) ≤ invtSubmoduleToLieIdeal q hq := by
568-
rw [LieIdeal.toLieSubalgebra_toSubmodule, coe_invtSubmoduleToLieIdeal_eq_iSup,
569-
LieSubmodule.iSup_toSubmodule]
570-
exact le_iSup_of_le ⟨i.val, hi, hα₀⟩ le_rfl
571-
rw [h] at h_sl2_le
572-
simp only [LieIdeal.toLieSubalgebra_toSubmodule, LieSubmodule.bot_toSubmodule, le_bot_iff,
573-
LieSubmodule.toSubmodule_eq_bot] at h_sl2_le
574-
exact sl2SubmoduleOfRoot_ne_bot i.1 hα₀ h_sl2_le
575-
· simp [h, invtSubmoduleToLieIdeal]
576-
577-
instance [IsSimple K L] : (rootSystem H).IsIrreducible := by
578-
have _i := nontrivial_of_isIrreducible K L L
579-
exact RootPairing.IsIrreducible.mk' (rootSystem H) <| fun q h₀ h₁ ↦ by
580-
have := IsSimple.eq_bot_or_eq_top (invtSubmoduleToLieIdeal q h₀)
581-
aesop
504+
@[gcongr]
505+
lemma invtSubmoduleToLieIdeal_mono {q₁ q₂ : Submodule K (Dual K H)}
506+
(hq₁ : ∀ i, q₁ ∈ End.invtSubmodule ((rootSystem H).reflection i).toLinearMap)
507+
(hq₂ : ∀ i, q₂ ∈ End.invtSubmodule ((rootSystem H).reflection i).toLinearMap)
508+
(h : q₁ ≤ q₂) :
509+
invtSubmoduleToLieIdeal q₁ hq₁ ≤ invtSubmoduleToLieIdeal q₂ hq₂ := by
510+
change (invtSubmoduleToLieIdeal q₁ hq₁).restr H ≤ (invtSubmoduleToLieIdeal q₂ hq₂).restr H
511+
exact iSup_le fun ⟨α, hα_mem, hα_nz⟩ ↦ le_iSup_of_le ⟨α, h hα_mem, hα_nz⟩ le_rfl
512+
513+
lemma lieIdealOrderIso_left_inv (I : LieIdeal K L)
514+
(hI : ∀ α, I.rootSpan ∈ End.invtSubmodule ((rootSystem H).reflection α).toLinearMap :=
515+
(rootSystem H).mem_invtRootSubmodule_iff.mp I.rootSpan_mem_invtRootSubmodule) :
516+
invtSubmoduleToLieIdeal I.rootSpan hI = I := by
517+
set J := invtSubmoduleToLieIdeal I.rootSpan
518+
((rootSystem H).mem_invtRootSubmodule_iff.mp I.rootSpan_mem_invtRootSubmodule)
519+
have h_eq : ∀ α : H.root, α ∈ J.rootSet ↔ α ∈ I.rootSet := fun α ↦ by
520+
rw [mem_rootSet_invtSubmoduleToLieIdeal, rootSystem_root_apply]
521+
exact ⟨I.mem_rootSet_of_mem_rootSpan, fun h ↦ Submodule.subset_span ⟨α, h, rfl⟩⟩
522+
have h_restr : J.restr H = I.restr H := by
523+
rw [J.restr_eq_iSup_sl2SubmoduleOfRoot, I.restr_eq_iSup_sl2SubmoduleOfRoot]
524+
exact le_antisymm
525+
(iSup₂_le fun α hα ↦ le_iSup₂_of_le α ((h_eq α).1 hα) le_rfl)
526+
(iSup₂_le fun α hα ↦ le_iSup₂_of_le α ((h_eq α).2 hα) le_rfl)
527+
rw [← LieSubmodule.toSubmodule_inj, ← LieSubmodule.restr_toSubmodule J H,
528+
← LieSubmodule.restr_toSubmodule I H, h_restr]
529+
530+
lemma lieIdealOrderIso_right_inv (q : (rootSystem H).invtRootSubmodule)
531+
(hq : ∀ α, ↑q ∈ End.invtSubmodule ((rootSystem H).reflection α).toLinearMap :=
532+
(rootSystem H).mem_invtRootSubmodule_iff.mp q.property) :
533+
(invtSubmoduleToLieIdeal q.1 hq).toInvtRootSubmodule = q := by
534+
simp only [Subtype.ext_iff, LieIdeal.toInvtRootSubmodule, LieIdeal.rootSpan, LieIdeal.rootSet]
535+
conv_rhs => rw [RootPairing.invtRootSubmodule.eq_span_root q]
536+
congr 2; ext α
537+
exact mem_rootSet_invtSubmoduleToLieIdeal _ _
538+
539+
variable (H) in
540+
/-- The order isomorphism between Lie ideals and invariant root submodules. -/
541+
noncomputable def lieIdealOrderIso :
542+
LieIdeal K L ≃o (rootSystem H).invtRootSubmodule where
543+
toFun := LieIdeal.toInvtRootSubmodule
544+
invFun q := invtSubmoduleToLieIdeal q.1 ((rootSystem H).mem_invtRootSubmodule_iff.mp q.2)
545+
left_inv := lieIdealOrderIso_left_inv
546+
right_inv := lieIdealOrderIso_right_inv
547+
map_rel_iff' {I J} := by
548+
refine ⟨fun h ↦ ?_, LieIdeal.toInvtRootSubmodule_mono⟩
549+
rw [← lieIdealOrderIso_left_inv (H := H) I, ← lieIdealOrderIso_left_inv (H := H) J]
550+
exact invtSubmoduleToLieIdeal_mono _ _ h
551+
552+
/-- A Killing Lie algebra is simple if and only if its root system is irreducible. -/
553+
theorem isSimple_iff_isIrreducible : (rootSystem H).IsIrreducible ↔ IsSimple K L := by
554+
nontriviality L
555+
have hL : ¬ IsLieAbelian L :=
556+
(isLieAbelian_iff_subsingleton K (L := L)).not.mpr (not_subsingleton L)
557+
rw [RootPairing.isIrreducible_iff_invtRootSubmodule, ← isSimple_iff_of_not_isLieAbelian K L hL,
558+
(lieIdealOrderIso H).isSimpleOrder_iff]
559+
560+
instance [IsSimple K L] : (rootSystem H).IsIrreducible :=
561+
isSimple_iff_isIrreducible.mpr ‹_›
582562

583563
end LieAlgebra.IsKilling

Mathlib/LinearAlgebra/RootSystem/Irreducible.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,11 @@ lemma isSimpleModule_weylGroupRootRep [P.IsIrreducible] :
166166
have := IsIrreducible.nontrivial P
167167
P.isSimpleModule_weylGroupRootRep_iff.mpr IsIrreducible.eq_top_of_invtSubmodule_reflection
168168

169+
@[nontriviality]
170+
lemma not_isIrreducible_of_subsingleton [Subsingleton M] :
171+
¬ P.IsIrreducible :=
172+
fun contra ↦ not_nontrivial _ contra.nontrivial
173+
169174
/-- A nonempty irreducible root pairing is a root system. -/
170175
instance [Nonempty ι] [NeZero (2 : R)] [P.IsIrreducible] : P.IsRootSystem where
171176
span_root_eq_top := IsIrreducible.eq_top_of_invtSubmodule_reflection

0 commit comments

Comments
 (0)