Skip to content

Commit 4e3dee5

Browse files
feat(Algebra/Lie/Extension): 2-cocycle from a Lie algebra extension with abelian kernel and a linear splitting (#31462)
This PR defines the Lie algebra 2-cocycle of a Lie algebra extension with abelian kernel equipped with a linear splitting. Co-authored-by: Oliver Nash <github@olivernash.org>
1 parent 05f1a82 commit 4e3dee5

File tree

4 files changed

+181
-13
lines changed

4 files changed

+181
-13
lines changed

Mathlib/Algebra/Lie/Abelian.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,15 @@ protected theorem mem_ker (x : L) : x ∈ LieModule.ker R L M ↔ ∀ m : M, ⁅
142142
simp only [LieModule.ker, LieHom.mem_ker, LinearMap.ext_iff, LinearMap.zero_apply,
143143
toEnd_apply_apply]
144144

145+
lemma _root_.LieIdeal.isLieAbelian_iff {I : LieIdeal R L} :
146+
IsLieAbelian I ↔ I ≤ LieModule.ker R L I := by
147+
refine ⟨fun hI x hx ↦ LieHom.mem_ker.mpr ?_, fun h ↦ ⟨fun ⟨x, hx⟩ ⟨y, hy⟩ ↦ ?_⟩⟩
148+
· ext y
149+
have := IsTrivial.trivial (⟨x, hx⟩ : I) y
150+
rw [LieIdeal.coe_bracket_of_module] at this
151+
simp [this]
152+
· simpa using LinearMap.congr_fun (h hx) ⟨y, hy⟩
153+
145154
lemma isFaithful_iff_ker_eq_bot : IsFaithful R L M ↔ LieModule.ker R L M = ⊥ := by
146155
rw [isFaithful_iff', LieSubmodule.ext_iff]
147156
aesop

Mathlib/Algebra/Lie/Cochain.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ instance : LinearMapClass (twoCochain R L M) R L (L →ₗ[R] M) where
6262
map_add a := a.1.map_add
6363
map_smulₛₗ a := a.1.map_smul
6464

65+
@[simp]
66+
lemma mem_twoCochain_iff {c : L →ₗ[R] L →ₗ[R] M} : c ∈ twoCochain R L M ↔ ∀ x, c x x = 0 := Iff.rfl
67+
6568
@[simp]
6669
lemma twoCochain_alt (a : twoCochain R L M) (x : L) :
6770
a x x = 0 :=

Mathlib/Algebra/Lie/Extension.lean

Lines changed: 165 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ module
77

88
public import Mathlib.Algebra.Exact
99
public import Mathlib.Algebra.Lie.Cochain
10-
public import Mathlib.Algebra.Module.TransferInstance
1110

1211
/-!
1312
# Extensions of Lie algebras
@@ -24,12 +23,14 @@ change of signs in the "action" part of the Lie bracket.
2423
* `LieAlgebra.IsExtension.extension`: A function that builds the bundled structure from the class.
2524
* `LieAlgebra.ofTwoCocycle`: The Lie algebra built from a direct product, but whose bracket product
2625
is sheared by a 2-cocycle.
27-
* `LieAlgebra.Extension.ofTwoCocycle` - The Lie algebra extension constructed from a 2-cocycle.
26+
* `LieAlgebra.Extension.ofTwoCocycle`: The Lie algebra extension constructed from a 2-cocycle.
27+
* `LieAlgebra.Extension.ringModuleOf`: Given an extension whose kernel is abelian, we obtain a Lie
28+
action of the target on the kernel.
29+
* `LieAlgebra.Extension.twoCocycle`: The 2-cocycle attached to an extension with a linear section.
2830
2931
## TODO
3032
* `IsCentral` - central extensions
3133
* `Equiv` - equivalence of extensions
32-
* The 2-cocycle given by a linear splitting of an extension.
3334
* The 2-coboundary from two linear splittings of an extension.
3435
3536
## References
@@ -60,6 +61,11 @@ lemma _root_.LieHom.range_eq_ker_iff (i : N →ₗ⁅R⁆ L) (p : L →ₗ⁅R
6061
i.range = p.ker ↔ Function.Exact i p :=
6162
fun h x ↦ by simp [← LieHom.coe_range, h], fun h ↦ (p.ker.toLieSubalgebra.ext i.range h).symm⟩
6263

64+
/-- The equivalence from the kernel of the projection. -/
65+
def IsExtension.kerEquivRange (i : N →ₗ⁅R⁆ L) (p : L →ₗ⁅R⁆ M) [IsExtension i p] :
66+
p.ker ≃ₗ[R] i.range :=
67+
.ofEq (R := R) (M := L) p.ker i.range <| by simp [exact (i := i) (p := p)]
68+
6369
variable (R N M) in
6470
/-- The type of all Lie extensions of `M` by `N`. That is, short exact sequences of `R`-Lie algebra
6571
homomorphisms `0 → N → L → M → 0` where `R`, `M`, and `N` are fixed. -/
@@ -76,20 +82,45 @@ structure Extension where
7682
proj : L →ₗ⁅R⁆ M
7783
IsExtension : IsExtension incl proj
7884

85+
instance (E : Extension R M N) : LieRing E.L := E.instLieRing
86+
instance (E : Extension R M N) : LieAlgebra R E.L := E.instLieAlgebra
87+
7988
/-- The bundled `LieAlgebra.Extension` corresponding to `LieAlgebra.IsExtension` -/
8089
@[simps] def IsExtension.extension {i : N →ₗ⁅R⁆ L} {p : L →ₗ⁅R⁆ M} (h : IsExtension i p) :
8190
Extension R N M :=
8291
⟨L, _, _, i, p, h⟩
8392

8493
/-- A surjective Lie algebra homomorphism yields an extension. -/
85-
theorem isExtension_of_surjective (f : L →ₗ⁅R⁆ M) (hf : Function.Surjective f) :
94+
lemma isExtension_of_surjective (f : L →ₗ⁅R⁆ M) (hf : Function.Surjective f) :
8695
IsExtension f.ker.incl f where
8796
ker_eq_bot := LieIdeal.ker_incl f.ker
8897
range_eq_top := (LieHom.range_eq_top f).mpr hf
8998
exact := LieIdeal.incl_range f.ker
9099

91100
end IsExtension
92101

102+
namespace Extension
103+
104+
variable [CommRing R] [LieRing L] [LieAlgebra R L] [LieRing M] [LieAlgebra R M]
105+
106+
lemma incl_apply_mem_ker (E : Extension R M L) (x : M) :
107+
E.incl x ∈ E.proj.ker :=
108+
Function.Exact.apply_apply_eq_zero ((E.incl.range_eq_ker_iff E.proj).mp E.IsExtension.exact) x
109+
110+
@[simp] lemma proj_incl (E : Extension R M L) (x : M) :
111+
E.proj (E.incl x) = 0 :=
112+
LieHom.mem_ker.mp (incl_apply_mem_ker E x)
113+
114+
lemma incl_injective (E : Extension R M L) :
115+
Function.Injective E.incl :=
116+
(LieHom.ker_eq_bot E.incl).mp E.IsExtension.ker_eq_bot
117+
118+
lemma proj_surjective (E : Extension R M L) :
119+
Function.Surjective E.proj :=
120+
(LieHom.range_eq_top E.proj).mp E.IsExtension.range_eq_top
121+
122+
end Extension
123+
93124
section Algebra
94125

95126
variable [CommRing R] [LieRing L] [LieAlgebra R L]
@@ -111,7 +142,7 @@ variable [AddCommGroup M] [Module R M] [LieRingModule L M] [LieModule R L M]
111142
used to transfer the additive and scalar-multiple structure on the direct product to the type
112143
synonym. -/
113144
def ofProd : L × M ≃ ofTwoCocycle c where
114-
toFun a := ⟨ a
145+
toFun a := ⟨a
115146
invFun a := a.carrier
116147

117148
-- transport instances along the equivalence
@@ -181,8 +212,11 @@ namespace Extension
181212

182213
open LieModule.Cohomology
183214

184-
variable [CommRing R] [LieRing L] [LieAlgebra R L] [LieRing M] [LieAlgebra R M] [IsLieAbelian M]
185-
[LieRingModule L M] [LieModule R L M] (c : twoCocycle R L M)
215+
variable [CommRing R] [LieRing L] [LieAlgebra R L] [LieRing M] [LieAlgebra R M]
216+
217+
section TwoCocycle
218+
219+
variable [IsLieAbelian M] [LieRingModule L M] [LieModule R L M] (c : twoCocycle R L M)
186220

187221
/-- The extension of Lie algebras defined by a 2-cocycle. -/
188222
def ofTwoCocycle : Extension R M L where
@@ -223,15 +257,133 @@ def ofTwoCocycle : Extension R M L where
223257
nth_rw 2 [← Equiv.apply_symm_apply (ofProd c) x]
224258
rw [← this] }
225259

226-
instance : LieRing (ofTwoCocycle c).L := (ofTwoCocycle c).instLieRing
227-
instance : LieAlgebra R (ofTwoCocycle c).L := (ofTwoCocycle c).instLieAlgebra
228-
229260
/-- The Lie algebra isomorphism given by the type synonym. -/
230261
def ofAlg : LieAlgebra.ofTwoCocycle c ≃ₗ⁅R⁆ (ofTwoCocycle c).L := LieEquiv.refl
231262

232263
lemma bracket (x y : (ofTwoCocycle c).L) :
233-
⁅x, y⁆ = ofAlg c ⁅(ofAlg c).symm x, (ofAlg c).symm y⁆ := rfl
264+
⁅x, y⁆ = ofAlg c ⁅(ofAlg c).symm x, (ofAlg c).symm y⁆ :=
265+
rfl
234266

235-
end Extension
267+
@[simp]
268+
lemma ofTwoCocycle_incl_apply (x : M) : (ofTwoCocycle c).incl x = ⟨(0, x)⟩ :=
269+
rfl
270+
271+
@[simp]
272+
lemma ofTwoCocycle_proj_apply (x : (ofTwoCocycle c).L) : (ofTwoCocycle c).proj x = x.carrier.1 :=
273+
rfl
274+
275+
end TwoCocycle
276+
277+
lemma lie_incl_mem_ker {E : Extension R M L} (x : E.L) (y : M) :
278+
⁅x, E.incl y⁆ ∈ E.proj.ker := by
279+
rw [LieHom.mem_ker, LieHom.map_lie, proj_incl, lie_zero]
280+
281+
/-- The Lie algebra isomorphism from the kernel of an extension to the kernel of the projection. -/
282+
noncomputable def toKer (E : Extension R M L) :
283+
M ≃ₗ⁅R⁆ E.proj.ker where
284+
toFun m := ⟨E.incl m, E.incl_apply_mem_ker m⟩
285+
map_add' _ _ := by simp
286+
map_smul' _ _ := by simp
287+
map_lie' {x y} := by ext; simp [← LieHom.map_lie]
288+
invFun := (Equiv.ofInjective E.incl E.incl_injective).symm ∘ E.IsExtension.kerEquivRange
289+
left_inv _ := by
290+
simp [IsExtension.kerEquivRange, Equiv.symm_apply_eq]
291+
rfl
292+
right_inv x := by simpa [Subtype.ext_iff] using Equiv.apply_ofInjective_symm E.incl_injective _
293+
294+
@[simp] lemma lie_toKer_apply (E : Extension R M L) (x : M) (y : E.L) :
295+
⁅y, (E.toKer x : E.L)⁆ = ⁅y, E.incl x⁆ := by
296+
rfl
236297

237-
end LieAlgebra
298+
instance [IsLieAbelian M] (E : Extension R M L) : IsLieAbelian E.proj.ker :=
299+
(lie_abelian_iff_equiv_lie_abelian E.toKer.symm).mpr inferInstance
300+
301+
/-- Given an extension of `L` by `M` whose kernel `M` is abelian, the kernel `M` gets an `L`-module
302+
structure. We do not make this an instance, because we may have to work with more than one
303+
extension. -/
304+
@[simps]
305+
noncomputable def ringModuleOf [IsLieAbelian M] (E : Extension R M L) : LieRingModule L M where
306+
bracket x y := E.toKer.symm ⁅E.proj_surjective.hasRightInverse.choose x, E.toKer y⁆
307+
add_lie x y m := by
308+
set h := E.proj_surjective.hasRightInverse
309+
rw [← map_add, ← add_lie, eq_comm, EquivLike.apply_eq_iff_eq, ← sub_eq_zero, ← sub_lie]
310+
exact trivial_lie_zero E.proj.ker _ ⟨_, by simp [h.choose_spec _]⟩ (E.toKer m)
311+
lie_add x m n := by simp [← map_add, ← lie_add]
312+
leibniz_lie x y m := by
313+
set h := E.proj_surjective.hasRightInverse
314+
have aux (z : E.proj.ker) : ⁅⁅h.choose x, h.choose y⁆, z⁆ = ⁅h.choose ⁅x, y⁆, z⁆ := by
315+
rw [← sub_eq_zero, ← sub_lie]
316+
exact trivial_lie_zero E.proj.ker _ ⟨_, by simp [h.choose_spec _]⟩ z
317+
rw [← map_add, EquivLike.apply_eq_iff_eq, LieEquiv.apply_symm_apply, LieEquiv.apply_symm_apply,
318+
leibniz_lie, aux]
319+
320+
/-- Given an extension of `L` by `M` whose kernel `M` is abelian, the kernel `M` gets an `R`-linear
321+
`L`-module structure. We do not make this an instance, because we may have to work with more than
322+
one extension. -/
323+
lemma lieModuleOf [IsLieAbelian M] (E : Extension R M L) :
324+
letI := E.ringModuleOf
325+
LieModule R L M := by
326+
letI := E.ringModuleOf
327+
set h := E.proj_surjective.hasRightInverse
328+
exact
329+
{ smul_lie r x m := by
330+
rw [ringModuleOf_bracket, ringModuleOf_bracket, ← map_smul, ← smul_lie,
331+
EquivLike.apply_eq_iff_eq, ← sub_eq_zero, ← sub_lie]
332+
exact trivial_lie_zero E.proj.ker _ ⟨_, by simp [h.choose_spec _]⟩ (E.toKer m)
333+
lie_smul r x m := by simp }
334+
335+
lemma toKer_bracket [IsLieAbelian M] (E : Extension R M L) (x : E.proj.ker) (y : L) :
336+
letI := E.ringModuleOf
337+
E.toKer ⁅y, E.toKer.symm x⁆ = ⁅E.proj_surjective.hasRightInverse.choose y, x⁆ := by
338+
simp
339+
340+
lemma lie_apply_proj_of_leftInverse_eq [IsLieAbelian M] (E : Extension R M L) {s : L →ₗ[R] E.L}
341+
(hs : Function.LeftInverse E.proj s) (x : E.L) (y : E.proj.ker) :
342+
⁅s (E.proj x), y⁆ = ⁅x, y⁆ := by
343+
rw [← sub_eq_zero, ← sub_lie]
344+
exact trivial_lie_zero E.proj.ker E.proj.ker ⟨_, (by simp [hs.eq])⟩ y
345+
346+
/-- A preparatory function for making a 2-cocycle from a linear splitting of an extension. -/
347+
private abbrev twoCocycleAux (E : Extension R M L) {s : L →ₗ[R] E.L}
348+
(hs : Function.LeftInverse E.proj s) :
349+
L →ₗ[R] L →ₗ[R] E.proj.ker where
350+
toFun x :=
351+
{ toFun y := ⟨⁅s x, s y⁆ - s ⁅x, y⁆, by simp [hs.eq]⟩
352+
map_add' _ _ := by simp; abel
353+
map_smul' _ _ := by simp [smul_sub] }
354+
map_add' x y := by ext; simp; abel
355+
map_smul' _ _ := by ext; simp [smul_sub]
356+
357+
/-- The 2-cocycle attached to an extension with a linear section. -/
358+
@[simps]
359+
noncomputable def twoCocycleOf [IsLieAbelian M] (E : Extension R M L) {s : L →ₗ[R] E.L}
360+
(hs : Function.LeftInverse E.proj s) :
361+
letI := E.ringModuleOf
362+
have := E.lieModuleOf
363+
twoCocycle R L M where
364+
val := ⟨(E.twoCocycleAux hs).compr₂ E.toKer.symm, by simp⟩
365+
property := by
366+
-- TODO Try to golf this after https://github.com/leanprover-community/mathlib4/pull/27306 lands
367+
ext x y z
368+
suffices ⁅s x, ⁅s y, s z⁆⁆ - ⁅s x, s ⁅y, z⁆⁆ -
369+
(⁅s y, ⁅s x, s z⁆⁆ - ⁅s y, s ⁅x, z⁆⁆) + (⁅s z, ⁅s x, s y⁆⁆ - ⁅s z, s ⁅x, y⁆⁆) -
370+
(⁅s ⁅x, y⁆, s z⁆ - (s ⁅x, ⁅y, z⁆⁆ - s ⁅y, ⁅x, z⁆⁆)) +
371+
(⁅s ⁅x, z⁆, s y⁆ - (s ⁅x, ⁅z, y⁆⁆ - s ⁅z, ⁅x, y⁆⁆)) -
372+
(⁅s ⁅y, z⁆, s x⁆ - (s ⁅y, ⁅z, x⁆⁆ - s ⁅z, ⁅y, x⁆⁆)) = 0 by
373+
set h := E.proj_surjective.hasRightInverse
374+
have aux (u : L) (v : E.proj.ker) : ⁅h.choose u, v⁆ = ⁅s u, v⁆ := by
375+
rw [← E.lie_apply_proj_of_leftInverse_eq hs, h.choose_spec _]
376+
simpa [← map_sub, ← map_add, ← twoCochain_val_apply, Subtype.ext_iff, twoCocycleAux, aux]
377+
have hjac := lie_lie (s x) (s y) (s z)
378+
rw [← lie_skew, neg_eq_iff_eq_neg] at hjac
379+
have hja := congr_arg s (lie_lie x y z)
380+
rw [← lie_skew, map_neg, neg_eq_iff_eq_neg] at hja
381+
have hj := congr_arg s (lie_lie y x z)
382+
rw [← lie_skew, map_neg, neg_eq_iff_eq_neg] at hj
383+
rw [hjac, hj, hja, ← lie_skew y z, ← lie_skew _ (s (-⁅z, y⁆)), ← lie_skew (s ⁅x, z⁆),
384+
← lie_skew (s ⁅x, y⁆), ← lie_skew x z]
385+
simp only [map_neg, neg_lie, neg_neg, neg_sub, lie_neg, sub_neg_eq_add,
386+
sub_add_cancel_right, map_add, neg_add_rev]
387+
abel_nf
388+
389+
end LieAlgebra.Extension

Mathlib/Logic/Function/Basic.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,10 @@ theorem injective_of_isPartialInv_right {α β} {f : α → β} {g} (H : IsParti
285285
(h₁ : b ∈ g x) (h₂ : b ∈ g y) : x = y :=
286286
((H _ _).1 h₁).symm.trans ((H _ _).1 h₂)
287287

288+
lemma LeftInverse.eq {g : β → α} {f : α → β} (h : LeftInverse g f) (x : α) : g (f x) = x := h x
289+
290+
lemma RightInverse.eq {g : β → α} {f : α → β} (h : RightInverse g f) (x : β) : f (g x) = x := h x
291+
288292
theorem LeftInverse.comp_eq_id {f : α → β} {g : β → α} (h : LeftInverse f g) : f ∘ g = id :=
289293
funext h
290294

0 commit comments

Comments
 (0)