Skip to content

Commit 6dbe457

Browse files
frederic-marbachocfnash
authored andcommitted
feat(Algebra/Lie): prove derivations are inner in finite-dimensional Killing Lie algebra (#12250)
This finishes the proof that all derivations in a finite-dimensional Lie algebra with non-degenerate Killing form are inner derivations, a project discussed in [this thread](https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/Derivations.20on.20Lie.20algebras) with @ocfnash. Co-authored-by: Oliver Nash <github@olivernash.org>
1 parent 223e4a5 commit 6dbe457

File tree

6 files changed

+157
-19
lines changed

6 files changed

+157
-19
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ import Mathlib.Algebra.Lie.Character
328328
import Mathlib.Algebra.Lie.Classical
329329
import Mathlib.Algebra.Lie.Derivation.AdjointAction
330330
import Mathlib.Algebra.Lie.Derivation.Basic
331+
import Mathlib.Algebra.Lie.Derivation.Killing
331332
import Mathlib.Algebra.Lie.DirectSum
332333
import Mathlib.Algebra.Lie.Engel
333334
import Mathlib.Algebra.Lie.EngelSubalgebra

Mathlib/Algebra/Lie/Derivation/AdjointAction.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ lemma ad_ker_eq_center : (ad R L).ker = LieAlgebra.center R L := by
6060
rw [← LieAlgebra.self_module_ker_eq_center, LieHom.mem_ker, LieModule.mem_ker]
6161
simp [DFunLike.ext_iff]
6262

63+
/-- If the center of a Lie algebra is trivial, then the adjoint action is injective. -/
64+
lemma injective_ad_of_center_eq_bot (h : LieAlgebra.center R L = ⊥) :
65+
Function.Injective (ad R L) := by
66+
rw [← LieHom.ker_eq_bot, ad_ker_eq_center, h]
67+
6368
/-- The commutator of a derivation `D` and a derivation of the form `ad x` is `ad (D x)`. -/
6469
lemma lie_der_ad_eq_ad_der (D : LieDerivation R L L) (x : L) : ⁅D, ad R L x⁆ = ad R L (D x) := by
6570
ext a
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/-
2+
Copyright © 2024 Frédéric Marbach. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Frédéric Marbach
5+
-/
6+
import Mathlib.Algebra.Lie.Derivation.AdjointAction
7+
import Mathlib.Algebra.Lie.Killing
8+
import Mathlib.LinearAlgebra.BilinearForm.Orthogonal
9+
10+
/-!
11+
# Derivations of finite dimensional Killing Lie algebras
12+
13+
This file establishes that all derivations of finite-dimensional Killing Lie algebras are inner.
14+
15+
## Main statements
16+
17+
- `LieDerivation.ad_mem_orthogonal_of_mem_orthogonal`: if a derivation `D` is in the Killing
18+
orthogonal of the range of the adjoint action, then, for any `x : L`, `ad (D x)` is also in this
19+
orthogonal.
20+
- `LieDerivation.Killing.range_ad_eq_top`: in a finite-dimensional Lie algebra with non-degenerate
21+
Killing form, the range of the adjoint action is full,
22+
- `LieDerivation.Killing.exists_eq_ad`: in a finite-dimensional Lie algebra with non-degenerate
23+
Killing form, any derivation is an inner derivation.
24+
-/
25+
26+
namespace LieDerivation.Killing
27+
28+
section
29+
30+
variable (R L : Type*) [Field R] [LieRing L] [LieAlgebra R L] [Module.Finite R L]
31+
32+
/-- A local notation for the set of (Lie) derivations on `L`. -/
33+
local notation "𝔻" => (LieDerivation R L L)
34+
35+
/-- A local notation for the range of `ad`. -/
36+
local notation "𝕀" => (LieHom.range (ad R L))
37+
38+
/-- A local notation for the Killing complement of the ideal range of `ad`. -/
39+
local notation "𝕀ᗮ" => LinearMap.BilinForm.orthogonal (killingForm R 𝔻) 𝕀
40+
41+
lemma killingForm_restrict_range_ad : (killingForm R 𝔻).restrict 𝕀 = killingForm R 𝕀 := by
42+
rw [← (ad_isIdealMorphism R L).eq, ← LieIdeal.killingForm_eq]
43+
rfl
44+
45+
variable {R L}
46+
47+
/-- If a derivation `D` is in the Killing orthogonal of the range of the adjoint action, then, for
48+
any `x : L`, `ad (D x)` is also in this orthogonal. -/
49+
lemma ad_mem_orthogonal_of_mem_orthogonal {D : LieDerivation R L L} (hD : D ∈ 𝕀ᗮ) (x : L) :
50+
ad R L (D x) ∈ 𝕀ᗮ := by
51+
have : 𝕀ᗮ = (ad R L).idealRange.killingCompl := by
52+
simp [← (ad_isIdealMorphism R L).eq]
53+
rw [this] at hD ⊢
54+
rw [← lie_der_ad_eq_ad_der]
55+
exact lie_mem_left _ _ (ad R L).idealRange.killingCompl _ _ hD
56+
57+
lemma ad_mem_ker_killingForm_ad_range_of_mem_orthogonal
58+
{D : LieDerivation R L L} (hD : D ∈ 𝕀ᗮ) (x : L) :
59+
ad R L (D x) ∈ (LinearMap.ker (killingForm R 𝕀)).map (LieHom.range (ad R L)).subtype := by
60+
rw [← killingForm_restrict_range_ad]
61+
exact LinearMap.BilinForm.inf_orthogonal_self_le_ker_restrict
62+
(LieModule.traceForm_isSymm R 𝔻 𝔻).isRefl ⟨by simp, ad_mem_orthogonal_of_mem_orthogonal hD x⟩
63+
64+
variable (R L)
65+
variable [LieAlgebra.IsKilling R L]
66+
67+
@[simp] lemma ad_apply_eq_zero_iff (x : L) : ad R L x = 0 ↔ x = 0 := by
68+
refine ⟨fun h ↦ ?_, fun h ↦ by simp [h]⟩
69+
rwa [← LieHom.mem_ker, ad_ker_eq_center, LieAlgebra.center_eq_bot_of_semisimple,
70+
LieSubmodule.mem_bot] at h
71+
72+
instance instIsKilling_range_ad : LieAlgebra.IsKilling R 𝕀 :=
73+
(LieEquiv.ofInjective (ad R L) (injective_ad_of_center_eq_bot <| by simp)).isKilling
74+
75+
/-- The restriction of the Killing form of a finite-dimensional Killing Lie algebra to the range of
76+
the adjoint action is nondegenerate. -/
77+
lemma killingForm_restrict_range_ad_nondegenerate : ((killingForm R 𝔻).restrict 𝕀).Nondegenerate :=
78+
killingForm_restrict_range_ad R L ▸ LieAlgebra.IsKilling.killingForm_nondegenerate R _
79+
80+
/-- The range of the adjoint action on a finite-dimensional Killing Lie algebra is full. -/
81+
@[simp]
82+
lemma range_ad_eq_top : 𝕀 = ⊤ := by
83+
rw [← LieSubalgebra.coe_to_submodule_eq_iff]
84+
apply LinearMap.BilinForm.eq_top_of_restrict_nondegenerate_of_orthogonal_eq_bot
85+
(LieModule.traceForm_isSymm R 𝔻 𝔻).isRefl (killingForm_restrict_range_ad_nondegenerate R L)
86+
refine (Submodule.eq_bot_iff _).mpr fun D hD ↦ ext fun x ↦ ?_
87+
simpa using ad_mem_ker_killingForm_ad_range_of_mem_orthogonal hD x
88+
89+
variable {R L} in
90+
/-- Every derivation of a finite-dimensional Killing Lie algebra is an inner derivation. -/
91+
lemma exists_eq_ad (D : 𝔻) : ∃ x, ad R L x = D := by
92+
change D ∈ 𝕀
93+
rw [range_ad_eq_top R L]
94+
exact Submodule.mem_top
95+
96+
end

Mathlib/Algebra/Lie/Killing.lean

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ lemma traceForm_apply_apply (x y : L) :
8080
lemma traceForm_comm (x y : L) : traceForm R L M x y = traceForm R L M y x :=
8181
LinearMap.trace_mul_comm R (φ x) (φ y)
8282

83+
lemma traceForm_isSymm : LinearMap.IsSymm (traceForm R L M) := LieModule.traceForm_comm R L M
84+
8385
@[simp] lemma traceForm_flip : LinearMap.flip (traceForm R L M) = traceForm R L M :=
8486
Eq.symm <| LinearMap.ext₂ <| traceForm_comm R L M
8587

@@ -367,29 +369,28 @@ variable (I : LieIdeal R L)
367369

368370
/-- The orthogonal complement of an ideal with respect to the killing form is an ideal. -/
369371
noncomputable def killingCompl : LieIdeal R L :=
370-
{ LinearMap.ker ((killingForm R L).compl₁₂ LinearMap.id I.subtype) with
372+
{ __ := (killingForm R L).orthogonal I.toSubmodule
371373
lie_mem := by
372374
intro x y hy
373-
ext ⟨z, hz⟩
374-
suffices killingForm R L ⁅x, y⁆ z = 0 by simpa
375-
rw [LieModule.traceForm_comm, ← LieModule.traceForm_apply_lie_apply, LieModule.traceForm_comm]
376375
simp only [AddSubsemigroup.mem_carrier, AddSubmonoid.mem_toSubsemigroup,
377-
Submodule.mem_toAddSubmonoid, LinearMap.mem_ker] at hy
378-
replace hy := LinearMap.congr_fun hy ⟨⁅z, x⁆, lie_mem_left R L I z x hz⟩
379-
simpa using hy }
376+
Submodule.mem_toAddSubmonoid, LinearMap.BilinForm.mem_orthogonal_iff,
377+
LieSubmodule.mem_coeSubmodule, LinearMap.BilinForm.IsOrtho]
378+
intro z hz
379+
rw [← LieModule.traceForm_apply_lie_apply]
380+
exact hy _ <| lie_mem_left _ _ _ _ _ hz }
381+
382+
@[simp] lemma toSubmodule_killingCompl :
383+
LieSubmodule.toSubmodule I.killingCompl = (killingForm R L).orthogonal I.toSubmodule :=
384+
rfl
380385

381386
@[simp] lemma mem_killingCompl {x : L} :
382-
x ∈ I.killingCompl ↔ ∀ y ∈ I, killingForm R L x y = 0 := by
383-
change x ∈ LinearMap.ker ((killingForm R L).compl₁₂ LinearMap.id I.subtype) ↔ _
384-
simp only [LinearMap.mem_ker, LieModule.traceForm_apply_apply, LinearMap.ext_iff,
385-
LinearMap.compl₁₂_apply, LinearMap.id_coe, id_eq, Submodule.coeSubtype,
386-
LieModule.traceForm_apply_apply, LinearMap.zero_apply, Subtype.forall]
387+
x ∈ I.killingCompl ↔ ∀ y ∈ I, killingForm R L y x = 0 := by
387388
rfl
388389

389390
lemma coe_killingCompl_top :
390391
killingCompl R L ⊤ = LinearMap.ker (killingForm R L) := by
391-
ext
392-
simp [LinearMap.ext_iff]
392+
ext x
393+
simp [LinearMap.ext_iff, LinearMap.BilinForm.IsOrtho, LieModule.traceForm_comm R L L x]
393394

394395
variable [IsDomain R] [IsPrincipalIdealRing R]
395396

@@ -406,7 +407,7 @@ lemma restrict_killingForm :
406407
intro x (hx : x ∈ I)
407408
simp only [mem_killingCompl, LieSubmodule.mem_top, forall_true_left]
408409
intro y
409-
rw [LieModule.traceForm_comm, LieModule.traceForm_apply_apply]
410+
rw [LieModule.traceForm_apply_apply]
410411
exact LieSubmodule.traceForm_eq_zero_of_isTrivial I I (by simp) _ hx
411412

412413
end LieIdeal
@@ -746,7 +747,7 @@ respective Killing forms of `L` and `L'` satisfy `κ'(e x, e y) = κ(x, y)`. -/
746747
lemma isKilling_of_equiv [IsKilling R L] (e : L ≃ₗ⁅R⁆ L') : IsKilling R L' := by
747748
constructor
748749
ext x'
749-
rw [LieIdeal.mem_killingCompl]
750+
simp_rw [LieIdeal.mem_killingCompl, LieModule.traceForm_comm]
750751
refine ⟨fun hx' ↦ ?_, fun hx y _ ↦ hx ▸ LinearMap.map_zero₂ (killingForm R L') y⟩
751752
suffices e.symm x' ∈ LinearMap.ker (killingForm R L) by
752753
rw [IsKilling.ker_killingForm_eq_bot] at this

Mathlib/Algebra/Lie/Submodule.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,6 +1114,9 @@ theorem isIdealMorphism_def : f.IsIdealMorphism ↔ (f.idealRange : LieSubalgebr
11141114
Iff.rfl
11151115
#align lie_hom.is_ideal_morphism_def LieHom.isIdealMorphism_def
11161116

1117+
variable {f} in
1118+
theorem IsIdealMorphism.eq (hf : f.IsIdealMorphism) : f.idealRange = f.range := hf
1119+
11171120
theorem isIdealMorphism_iff : f.IsIdealMorphism ↔ ∀ (x : L') (y : L), ∃ z : L, ⁅x, f y⁆ = f z := by
11181121
simp only [isIdealMorphism_def, idealRange_eq_lieSpan_range, ←
11191122
LieSubalgebra.coe_to_submodule_eq_iff, ← f.range.coe_to_submodule,

Mathlib/LinearAlgebra/BilinearForm/Orthogonal.lean

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@ theorem mem_orthogonal_iff {N : Submodule R M} {m : M} :
161161
Iff.rfl
162162
#align bilin_form.mem_orthogonal_iff LinearMap.BilinForm.mem_orthogonal_iff
163163

164+
@[simp] lemma orthogonal_bot : B.orthogonal ⊥ = ⊤ := by ext; simp [IsOrtho]
165+
164166
theorem orthogonal_le (h : N ≤ L) : B.orthogonal L ≤ B.orthogonal N := fun _ hn l hl => hn l (h hl)
165167
#align bilin_form.orthogonal_le LinearMap.BilinForm.orthogonal_le
166168

@@ -318,7 +320,9 @@ variable [FiniteDimensional K V]
318320

319321
open FiniteDimensional Submodule
320322

321-
theorem finrank_add_finrank_orthogonal {B : BilinForm K V} {W : Subspace K V} (b₁ : B.IsRefl) :
323+
variable {B : BilinForm K V} {W : Subspace K V}
324+
325+
theorem finrank_add_finrank_orthogonal (b₁ : B.IsRefl) :
322326
finrank K W + finrank K (B.orthogonal W) =
323327
finrank K V + finrank K (W ⊓ B.orthogonal ⊤ : Subspace K V) := by
324328
rw [← toLin_restrict_ker_eq_inf_orthogonal _ _ b₁, ←
@@ -332,7 +336,7 @@ theorem finrank_add_finrank_orthogonal {B : BilinForm K V} {W : Subspace K V} (b
332336

333337
/-- A subspace is complement to its orthogonal complement with respect to some
334338
reflexive bilinear form if that bilinear form restricted on to the subspace is nondegenerate. -/
335-
theorem restrict_nondegenerate_of_isCompl_orthogonal {B : BilinForm K V} {W : Subspace K V}
339+
theorem restrict_nondegenerate_of_isCompl_orthogonal
336340
(b₁ : B.IsRefl) (b₂ : (B.restrict W).Nondegenerate) : IsCompl W (B.orthogonal W) := by
337341
have : W ⊓ B.orthogonal W = ⊥ := by
338342
rw [eq_bot_iff]
@@ -351,12 +355,40 @@ theorem restrict_nondegenerate_of_isCompl_orthogonal {B : BilinForm K V} {W : Su
351355

352356
/-- A subspace is complement to its orthogonal complement with respect to some reflexive bilinear
353357
form if and only if that bilinear form restricted on to the subspace is nondegenerate. -/
354-
theorem restrict_nondegenerate_iff_isCompl_orthogonal {B : BilinForm K V} {W : Subspace K V}
358+
theorem restrict_nondegenerate_iff_isCompl_orthogonal
355359
(b₁ : B.IsRefl) : (B.restrict W).Nondegenerate ↔ IsCompl W (B.orthogonal W) :=
356360
fun b₂ => restrict_nondegenerate_of_isCompl_orthogonal b₁ b₂, fun h =>
357361
B.nondegenerateRestrictOfDisjointOrthogonal b₁ h.1
358362
#align bilin_form.restrict_nondegenerate_iff_is_compl_orthogonal LinearMap.BilinForm.restrict_nondegenerate_iff_isCompl_orthogonal
359363

364+
lemma orthogonal_eq_top_iff (b₁ : B.IsRefl) (b₂ : (B.restrict W).Nondegenerate) :
365+
B.orthogonal W = ⊤ ↔ W = ⊥ := by
366+
refine ⟨fun h ↦ ?_, fun h ↦ by simp [h]⟩
367+
have := (B.restrict_nondegenerate_of_isCompl_orthogonal b₁ b₂).inf_eq_bot
368+
rwa [h, inf_top_eq] at this
369+
370+
lemma eq_top_of_restrict_nondegenerate_of_orthogonal_eq_bot
371+
(b₁ : B.IsRefl) (b₂ : (B.restrict W).Nondegenerate) (b₃ : B.orthogonal W = ⊥) :
372+
W = ⊤ := by
373+
have := (B.restrict_nondegenerate_of_isCompl_orthogonal b₁ b₂).sup_eq_top
374+
rwa [b₃, sup_bot_eq] at this
375+
376+
lemma orthogonal_eq_bot_iff
377+
(b₁ : B.IsRefl) (b₂ : (B.restrict W).Nondegenerate) (b₃ : B.Nondegenerate) :
378+
B.orthogonal W = ⊥ ↔ W = ⊤ := by
379+
refine ⟨eq_top_of_restrict_nondegenerate_of_orthogonal_eq_bot b₁ b₂, fun h ↦ ?_⟩
380+
rw [h, eq_bot_iff]
381+
exact fun x hx ↦ b₃ x fun y ↦ b₁ y x <| by simpa using hx y
382+
383+
lemma inf_orthogonal_self_le_ker_restrict (b₁ : B.IsRefl) :
384+
W ⊓ B.orthogonal W ≤ (LinearMap.ker <| B.restrict W).map W.subtype := by
385+
rintro v ⟨hv : v ∈ W, hv' : v ∈ B.orthogonal W⟩
386+
simp only [Submodule.mem_map, mem_ker, restrict_apply, Submodule.coeSubtype, Subtype.exists,
387+
exists_and_left, exists_prop, exists_eq_right_right]
388+
refine ⟨?_, hv⟩
389+
ext ⟨w, hw⟩
390+
exact b₁ w v <| hv' w hw
391+
360392
end
361393

362394
/-! We note that we cannot use `BilinForm.restrict_nondegenerate_iff_isCompl_orthogonal` for the

0 commit comments

Comments
 (0)