77
88public import Mathlib.Algebra.Exact
99public 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+
6369variable (R N M) in
6470/-- The type of all Lie extensions of `M` by `N`. That is, short exact sequences of `R`-Lie algebra
6571homomorphisms `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
91100end 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+
93124section Algebra
94125
95126variable [CommRing R] [LieRing L] [LieAlgebra R L]
@@ -111,7 +142,7 @@ variable [AddCommGroup M] [Module R M] [LieRingModule L M] [LieModule R L M]
111142used to transfer the additive and scalar-multiple structure on the direct product to the type
112143synonym. -/
113144def 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
182213open 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. -/
188222def 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. -/
230261def ofAlg : LieAlgebra.ofTwoCocycle c ≃ₗ⁅R⁆ (ofTwoCocycle c).L := LieEquiv.refl
231262
232263lemma 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
0 commit comments