/- Copyright 2026 The Formal Conjectures Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -/ module public import Mathlib.Analysis.Calculus.ContDiff.Comp public import Mathlib.Analysis.Calculus.ContDiff.Operations public import Mathlib.Analysis.Calculus.FDeriv.Bilinear public import Mathlib.Analysis.Calculus.FDeriv.Symmetric public import Mathlib.Analysis.Matrix.Normed public import Mathlib.Analysis.Normed.Module.FiniteDimension public import Mathlib.Analysis.SpecialFunctions.Exponential public import Mathlib.LinearAlgebra.Matrix.GeneralLinearGroup.Defs public import Mathlib.Topology.Instances.Matrix@[expose] public section

Lie derivatives of smooth functions on GL n ℝ

The C^∞ functions on GL n ℝ and the action on them of 𝔤𝔩 n ℝ and of its complexification 𝔤𝔩 n ℂ by left invariant differential operators. This is the analytic machinery behind condition (c) in the Borel-Jacquet definition of an automorphic form; see FormalConjecturesForMathlib.NumberTheory.AutomorphicForm.BorelJacquet for that definition, and Borel and Jacquet's Corvallis article, the reference below, for its source.

Main declarations

All in the namespace Matrix.GeneralLinearGroup unless qualified otherwise:

    AutomorphicForm.LieDerivAux.fderiv_rightDeriv_apply and …_sub_comm: the product rule and bracket identity for the operator F ↦ fun M => fderiv ℝ F M (M * X) over an abstract normed algebra.

    IsSmoothOnGL and smoothGL: the C^∞ functions on GL n ℝ, as a predicate and as a -submodule.

    expGL and lieDerivFun: the matrix exponential as an element of GL n ℝ, and the left invariant derivative (X • φ) y = d/dt φ (y * exp (t • X)) |_{t = 0}.

    lieDeriv and lieDerivC: the actions on smoothGL n of 𝔤𝔩 n ℝ and of its complexification 𝔤𝔩 n ℂ, with their bracket identities lieDeriv_bracket and lieDerivC_bracket.

Implementation notes

Smoothness on GL n ℝ is phrased as the existence of a C^∞ extension to the open set of invertible matrices (IsSmoothOnGL), rather than through a manifold structure: the normed ring instances on Matrix n n ℝ that would give GL n ℝ a chart are scoped, and conflict with the product topology that GL n ℝ already carries.

X ∈ 𝔤𝔩 n ℝ acts by differentiating along the one-parameter subgroup, (X • φ) y = d/dt φ (y * exp (t • X)) |_{t = 0}; this equals fderiv ℝ F y (y * X) for any C^∞ extension F of φ (lieDerivFun_eq_fderiv), through which every algebraic property is proved. The bracket identity is the product rule plus symmetry of the second derivative.

The product rule is proved over an abstract finite-dimensional normed -algebra and instantiated at Matrix n n ℝ. That is forced: Mathlib's norms on Matrix n n ℝ are scoped instances while its topology is global, so instance search cannot assemble SeminormedAddCommGroup (Matrix n n ℝ →L[ℝ] ℂ) for the written-out type even though the instance term typechecks, and the second-derivative lemmas behind the product rule need that instance as an argument. Instantiating an abstract lemma supplies its instance arguments instead of searching for them.

References:

    A. Borel and H. Jacquet, Automorphic forms and automorphic representations, in Automorphic Forms, Representations and L-functions (Corvallis), Proc. Sympos. Pure Math. 33, Part 1, Amer. Math. Soc. (1979), 189–207; §4.

open scoped ContDiff

The product rule, over an abstract normed algebra

In a group of units, left translation is the restriction of a linear map, so the left invariant vector field with value X at 1 has value M * X at M, and the first-order operator is F ↦ fun M => fderiv ℝ F M (M * X) — no manifold structure needed. This section proves its product rule and bracket identity over an abstract algebra A; see the implementation notes for why A cannot simply be Matrix n n ℝ.

namespace AutomorphicForm.LieDerivAuxvariable {A : Type*} [NormedRing A] [NormedAlgebra A] [FiniteDimensional A]

Right multiplication by X, as a continuous linear map.

noncomputable def mulRightL (X : A) : A →L[] A := LinearMap.toContinuousLinearMap (LinearMap.mulRight X)@[simp] lemma mulRightL_apply (X M : A) : mulRightL X M = M * X := A:Type u_1inst✝²:NormedRing Ainst✝¹:NormedAlgebra Ainst✝:FiniteDimensional AX:AM:A(mulRightL X) M = M * X All goals completed! 🐙

The product rule for the left invariant derivative F ↦ fun M => D F M (M * X): its derivative at y in the direction v picks up the first-order term D F y (v * X), from differentiating M ↦ M * X, and the second-order term D² F y v (y * X).

A:Type u_1inst✝²:NormedRing Ainst✝¹:NormedAlgebra Ainst✝:FiniteDimensional AF:A y:AhF:ContDiffAt F yX:Av:Ah₁:HasFDerivAt (fderiv F) (fderiv (fderiv F) y) yh₂:HasFDerivAt (fun M M * X) (mulRightL X) yh₃:HasFDerivAt ((fun p p.1 p.2) fun x (fderiv F x, x * X)) (.deriv (fderiv F y, y * X) ∘SL (fderiv (fderiv F) y).prod (mulRightL X)) yh₄:HasFDerivAt (fun M (fderiv F M) (M * X)) (.deriv (fderiv F y, y * X) ∘SL (fderiv (fderiv F) y).prod (mulRightL X)) y(.deriv (fderiv F y, y * X) ∘SL (fderiv (fderiv F) y).prod (mulRightL X)) v = (fderiv F y) (v * X) + ((fderiv (fderiv F) y) v) (y * X) All goals completed! 🐙

The commutator of two left invariant derivatives is the left invariant derivative along the commutator: the second-order terms cancel by symmetry of the second derivative.

A:Type u_1inst✝²:NormedRing Ainst✝¹:NormedAlgebra Ainst✝:FiniteDimensional AF:A y:AhF:ContDiffAt F yX:AY:Ahle:minSmoothness 2 hsymm:((fderiv (fderiv F) y) (y * X)) (y * Y) = ((fderiv (fderiv F) y) (y * Y)) (y * X)(fderiv F y) (y * X * Y) + ((fderiv (fderiv F) y) (y * X)) (y * Y) - ((fderiv F y) (y * Y * X) + ((fderiv (fderiv F) y) (y * Y)) (y * X)) = (fderiv F y) (y * X * Y) - (fderiv F y) (y * Y * X) All goals completed! 🐙end AutomorphicForm.LieDerivAuxnamespace Matrix.GeneralLinearGroupvariable {n : Type*} [Fintype n] [DecidableEq n]

Smooth functions on GL n ℝ

section Smoothopen scoped Matrix.Norms.Frobenius

φ : GL n ℝ → ℂ is C^∞: it extends to a C^∞ function on the open set of invertible matrices. Stating it this way avoids putting a manifold structure on GL n ℝ.

def IsSmoothOnGL (φ : GL n ) : Prop := F : Matrix n n , ContDiffOn F {M : Matrix n n | IsUnit M} y : GL n , F (y : Matrix n n ) = φ ylemma isSmoothOnGL_const (c : ) : IsSmoothOnGL (fun _ : GL n => c) := fun _ => c, contDiffOn_const, fun _ => rfllemma IsSmoothOnGL.add {φ ψ : GL n } ( : IsSmoothOnGL φ) ( : IsSmoothOnGL ψ) : IsSmoothOnGL (φ + ψ) := n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n ψ:GL n :IsSmoothOnGL φ:IsSmoothOnGL ψIsSmoothOnGL (φ + ψ) n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n ψ:GL n :IsSmoothOnGL ψF:Matrix n n hF:ContDiffOn F {M | IsUnit M}hFφ: (y : GL n ), F y = φ yIsSmoothOnGL (φ + ψ) n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n ψ:GL n F:Matrix n n hF:ContDiffOn F {M | IsUnit M}hFφ: (y : GL n ), F y = φ yG:Matrix n n hG:ContDiffOn G {M | IsUnit M}hGψ: (y : GL n ), G y = ψ yIsSmoothOnGL (φ + ψ) exact F + G, ContDiffOn.add hF hG, fun y => n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n ψ:GL n F:Matrix n n hF:ContDiffOn F {M | IsUnit M}hFφ: (y : GL n ), F y = φ yG:Matrix n n hG:ContDiffOn G {M | IsUnit M}hGψ: (y : GL n ), G y = ψ yy:GL n (F + G) y = (φ + ψ) y All goals completed! 🐙lemma IsSmoothOnGL.const_smul {φ : GL n } ( : IsSmoothOnGL φ) (c : ) : IsSmoothOnGL (c φ) := n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φc:IsSmoothOnGL (c φ) n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n c:F:Matrix n n hF:ContDiffOn F {M | IsUnit M}hFφ: (y : GL n ), F y = φ yIsSmoothOnGL (c φ) exact c F, ContDiffOn.const_smul c hF, fun y => n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n c:F:Matrix n n hF:ContDiffOn F {M | IsUnit M}hFφ: (y : GL n ), F y = φ yy:GL n (c F) y = (c φ) y All goals completed! 🐙

The invertible matrices are an open set: they are the nonvanishing locus of det.

n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nh:{M | IsUnit M} = (fun M M.det) ⁻¹' {x | x 0}IsOpen ((fun M M.det) ⁻¹' {x | x 0}) exact isOpen_ne.preimage (n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nh:{M | IsUnit M} = (fun M M.det) ⁻¹' {x | x 0}Continuous fun M M.det All goals completed! 🐙)lemma isUnit_coe (y : GL n ) : IsUnit (y : Matrix n n ) := y, rfl

A choice of C^∞ extension of φ to the invertible matrices, when one exists. Only its germ at each invertible matrix matters, by fderiv_extendGL_eq.

noncomputable def extendGL (φ : GL n ) : Matrix n n := haveI := Classical.propDecidable (IsSmoothOnGL φ) if h : IsSmoothOnGL φ then h.choose else 0n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φContDiffOn (Exists.choose ) {M | IsUnit M} All goals completed! 🐙n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φy:GL n Exists.choose y = φ y All goals completed! 🐙lemma contDiffAt_extendGL {φ : GL n } ( : IsSmoothOnGL φ) (y : GL n ) : ContDiffAt (extendGL φ) (y : Matrix n n ) := (contDiffOn_extendGL ).contDiffAt (isOpen_setOf_isUnit.mem_nhds (isUnit_coe y))

The derivative of the chosen extension at an invertible matrix does not depend on the choice: any two extensions of φ agree on the open set of invertible matrices.

All goals completed! 🐙
Left invariant derivatives

(X • φ) y = d/dt φ (y * exp (t • X)) |_{t = 0}, proved equal to the directional derivative fderiv ℝ F y (y * X) of any smooth extension F (lieDerivFun_eq_fderiv), which is the form all its properties are established in.

The exponential of a matrix, as an element of GL n ℝ: exp X is invertible with inverse exp (-X).

noncomputable def expGL (X : Matrix n n ) : GL n := (NormedSpace.isUnit_exp X).unit@[simp] lemma coe_expGL (X : Matrix n n ) : (expGL X : Matrix n n ) = NormedSpace.exp X := (NormedSpace.isUnit_exp X).unit_spec@[simp] lemma expGL_zero : expGL (0 : Matrix n n ) = 1 := Units.ext (n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq n(expGL 0) = 1 All goals completed! 🐙)

The left invariant derivative of φ along X: differentiate φ along the one-parameter subgroup t ↦ exp (t • X) acting on the right,

(X • φ) y = d/dt φ (y * exp (t • X)) |_{t = 0}.

This is the derivative that condition (c) of the definition of an automorphic form is about: the left invariant vector field with value X at 1 has value y * X at y, and lieDerivFun_eq_fderiv identifies the two descriptions for C^∞ functions.

noncomputable def lieDerivFun (X : Matrix n n ) (φ : GL n ) (y : GL n ) : := deriv (fun t : => φ (y * expGL (t X))) 0

Differentiating along the one-parameter subgroup computes the derivative of any smooth extension in the direction y * X.

n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φX:Matrix n n y:GL n hexp:HasDerivAt (fun y_1 y * NormedSpace.exp (y_1 X)) (y * X) 0hfun:(fun t φ (y * expGL (t X))) = fun t extendGL φ (y * NormedSpace.exp (t X))HasDerivAt (fun t extendGL φ (y * NormedSpace.exp (t X))) ((fderiv (extendGL φ) y) (y * X)) 0 exact HasFDerivAt.comp_hasDerivAt_of_eq (hl := ((contDiffAt_extendGL y).differentiableAt (n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φX:Matrix n n y:GL n hexp:HasDerivAt (fun y_1 y * NormedSpace.exp (y_1 X)) (y * X) 0hfun:(fun t φ (y * expGL (t X))) = fun t extendGL φ (y * NormedSpace.exp (t X)) 0 All goals completed! 🐙)).hasFDerivAt) (hf := hexp) (hy := n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φX:Matrix n n y:GL n hexp:HasDerivAt (fun y_1 y * NormedSpace.exp (y_1 X)) (y * X) 0hfun:(fun t φ (y * expGL (t X))) = fun t extendGL φ (y * NormedSpace.exp (t X))y = y * NormedSpace.exp (0 X) All goals completed! 🐙)

The one-parameter-subgroup description of the left invariant derivative agrees with the directional-derivative one. Every algebraic property below is proved through this bridge.

lemma lieDerivFun_eq_fderiv {φ : GL n } ( : IsSmoothOnGL φ) (X : Matrix n n ) (y : GL n ) : lieDerivFun X φ y = fderiv (extendGL φ) (y : Matrix n n ) ((y : Matrix n n ) * X) := (hasDerivAt_lieDerivFun X y).derivlemma IsSmoothOnGL.lieDerivFun {φ : GL n } ( : IsSmoothOnGL φ) (X : Matrix n n ) : IsSmoothOnGL (lieDerivFun X φ) := n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φX:Matrix n n IsSmoothOnGL (GeneralLinearGroup.lieDerivFun X φ) n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φX:Matrix n n M:Matrix n n hM:M {M | IsUnit M}ContDiffWithinAt (fun M (fderiv (extendGL φ) M) (M * X)) {M | IsUnit M} M n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φX:Matrix n n M:Matrix n n hM:M {M | IsUnit M}h:ContDiffAt (extendGL φ) MContDiffWithinAt (fun M (fderiv (extendGL φ) M) (M * X)) {M | IsUnit M} M exact (((h.fderiv_right (m := ) (n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φX:Matrix n n M:Matrix n n hM:M {M | IsUnit M}h:ContDiffAt (extendGL φ) M + 1 All goals completed! 🐙)).clm_apply (contDiffAt_id.mul contDiffAt_const))).contDiffWithinAt

The -submodule of C^∞ functions on GL n ℝ, which is what the Lie algebra and hence the universal enveloping algebra acts on.

def smoothGL (n : Type*) [Fintype n] [DecidableEq n] : Submodule (GL n ) where carrier := {φ | IsSmoothOnGL φ} zero_mem' := isSmoothOnGL_const 0 add_mem' := .add smul_mem' c _ := .const_smul c@[simp] lemma mem_smoothGL {φ : GL n } : φ smoothGL n IsSmoothOnGL φ := Iff.rfln:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n ψ:GL n :IsSmoothOnGL φ:IsSmoothOnGL ψX:Matrix n n y:GL n hadd:fderiv (extendGL φ + extendGL ψ) y = fderiv (extendGL φ) y + fderiv (extendGL ψ) y(fderiv (extendGL φ) y + fderiv (extendGL ψ) y) (y * X) = (lieDerivFun X φ + lieDerivFun X ψ) y All goals completed! 🐙n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φc:X:Matrix n n y:GL n hsmul:fderiv (c extendGL φ) y = c fderiv (extendGL φ) y(c fderiv (extendGL φ) y) (y * X) = (c lieDerivFun X φ) y All goals completed! 🐙@[simp] lemma lieDerivFun_zero_left (φ : GL n ) : lieDerivFun 0 φ = 0 := n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n lieDerivFun 0 φ = 0 n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n y:GL n lieDerivFun 0 φ y = 0 y; All goals completed! 🐙lemma lieDerivFun_add_left {φ : GL n } ( : IsSmoothOnGL φ) (X X' : Matrix n n ) : lieDerivFun (X + X') φ = lieDerivFun X φ + lieDerivFun X' φ := n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φX:Matrix n n X':Matrix n n lieDerivFun (X + X') φ = lieDerivFun X φ + lieDerivFun X' φ n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φX:Matrix n n X':Matrix n n y:GL n lieDerivFun (X + X') φ y = (lieDerivFun X φ + lieDerivFun X' φ) y All goals completed! 🐙lemma lieDerivFun_smul_left {φ : GL n } ( : IsSmoothOnGL φ) (r : ) (X : Matrix n n ) : lieDerivFun (r X) φ = r lieDerivFun X φ := n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φr:X:Matrix n n lieDerivFun (r X) φ = r lieDerivFun X φ n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φr:X:Matrix n n y:GL n lieDerivFun (r X) φ y = (r lieDerivFun X φ) y All goals completed! 🐙lemma lieDerivFun_const (X : Matrix n n ) (c : ) : lieDerivFun X (fun _ : GL n => c) = 0 := n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nX:Matrix n n c:(lieDerivFun X fun x c) = 0 n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nX:Matrix n n c:y:GL n lieDerivFun X (fun x c) y = 0 y All goals completed! 🐙

The left invariant derivative along X as a -linear endomorphism of the C^∞ functions on GL n ℝ.

noncomputable def lieDeriv (X : Matrix n n ) : smoothGL n →ₗ[] smoothGL n where toFun φ := lieDerivFun X (φ : GL n ), φ.2.lieDerivFun X map_add' φ ψ := Subtype.ext (n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nX:Matrix n n φ:(smoothGL n)ψ:(smoothGL n)lieDerivFun X (φ + ψ), = (lieDerivFun X φ, + lieDerivFun X ψ, ) All goals completed! 🐙) map_smul' c φ := Subtype.ext (n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nX:Matrix n n c:φ:(smoothGL n)lieDerivFun X (c φ), = ((RingHom.id ) c lieDerivFun X φ, ) All goals completed! 🐙)@[simp] lemma coe_lieDeriv (X : Matrix n n ) (φ : smoothGL n) : (lieDeriv X φ : GL n ) = lieDerivFun X (φ : GL n ) := rfl

The commutator of two left invariant derivatives is the left invariant derivative along the commutator of the directions. This is the bracket identity that makes lieDeriv a Lie algebra homomorphism; the second-order terms cancel by symmetry of the second derivative.

n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:GL n :IsSmoothOnGL φX:Matrix n n Y:Matrix n n y:GL n hY:fderiv (extendGL (lieDerivFun Y φ)) y = fderiv (fun M (fderiv (extendGL φ) M) (M * Y)) yhX:fderiv (extendGL (lieDerivFun X φ)) y = fderiv (fun M (fderiv (extendGL φ) M) (M * X)) y(fderiv (extendGL φ) y) (y * (X * Y - Y * X)) = (fderiv (fun M (fderiv (extendGL φ) M) (M * Y)) y) (y * X) - (fderiv (fun M (fderiv (extendGL φ) M) (M * X)) y) (y * Y) All goals completed! 🐙lemma lieDeriv_bracket (X Y : Matrix n n ) : lieDeriv (X * Y - Y * X) = lieDeriv X * lieDeriv Y - lieDeriv Y * lieDeriv X := n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nX:Matrix n n Y:Matrix n n lieDeriv (X * Y - Y * X) = lieDeriv X * lieDeriv Y - lieDeriv Y * lieDeriv X n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nX:Matrix n n Y:Matrix n n φ:(smoothGL n)((lieDeriv (X * Y - Y * X)) φ) = ((lieDeriv X * lieDeriv Y - lieDeriv Y * lieDeriv X) φ) All goals completed! 🐙@[simp] lemma lieDeriv_zero : lieDeriv (0 : Matrix n n ) = 0 := LinearMap.ext fun φ => Subtype.ext (n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nφ:(smoothGL n)((lieDeriv 0) φ) = (0 φ) All goals completed! 🐙)lemma lieDeriv_add (X X' : Matrix n n ) : lieDeriv (X + X') = lieDeriv X + lieDeriv X' := LinearMap.ext fun φ => Subtype.ext (n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nX:Matrix n n X':Matrix n n φ:(smoothGL n)((lieDeriv (X + X')) φ) = ((lieDeriv X + lieDeriv X') φ) All goals completed! 🐙)lemma lieDeriv_real_smul (r : ) (X : Matrix n n ) : lieDeriv (r X) = (r : ) lieDeriv X := LinearMap.ext fun φ => Subtype.ext (n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nr:X:Matrix n n φ:(smoothGL n)((lieDeriv (r X)) φ) = ((r lieDeriv X) φ) All goals completed! 🐙)n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nX:Matrix n n (-1) lieDeriv X = -lieDeriv X n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nX:Matrix n n -1 lieDeriv X = -lieDeriv X All goals completed! 🐙n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nX:Matrix n n X':Matrix n n lieDeriv X + -lieDeriv X' = lieDeriv X - lieDeriv X' All goals completed! 🐙
Complexification

𝔤𝔩 n ℂ = 𝔤𝔩 n ℝ ⊗ ℂ acts by X + i Y ↦ lieDeriv X + i • lieDeriv Y. Since the entrywise real and imaginary parts turn complex matrix multiplication into the expected pair of real products, the bracket identity over gives the bracket identity over .

sectionomit [Fintype n] [DecidableEq n]lemma map_re_add (Z W : Matrix n n ) : (Z + W).map Complex.re = Z.map Complex.re + W.map Complex.re := Matrix.map_add _ Complex.add_re Z Wlemma map_im_add (Z W : Matrix n n ) : (Z + W).map Complex.im = Z.map Complex.im + W.map Complex.im := Matrix.map_add _ Complex.add_im Z Wlemma map_re_sub (Z W : Matrix n n ) : (Z - W).map Complex.re = Z.map Complex.re - W.map Complex.re := Matrix.map_sub _ Complex.sub_re Z Wlemma map_im_sub (Z W : Matrix n n ) : (Z - W).map Complex.im = Z.map Complex.im - W.map Complex.im := Matrix.map_sub _ Complex.sub_im Z Wlemma map_re_smul (c : ) (Z : Matrix n n ) : (c Z).map Complex.re = c.re Z.map Complex.re - c.im Z.map Complex.im := n:Type u_1c:Z:Matrix n n (c Z).map Complex.re = c.re Z.map Complex.re - c.im Z.map Complex.im n:Type u_1c:Z:Matrix n n i:nj:n(c Z).map Complex.re i j = (c.re Z.map Complex.re - c.im Z.map Complex.im) i j; All goals completed! 🐙lemma map_im_smul (c : ) (Z : Matrix n n ) : (c Z).map Complex.im = c.re Z.map Complex.im + c.im Z.map Complex.re := n:Type u_1c:Z:Matrix n n (c Z).map Complex.im = c.re Z.map Complex.im + c.im Z.map Complex.re n:Type u_1c:Z:Matrix n n i:nj:n(c Z).map Complex.im i j = (c.re Z.map Complex.im + c.im Z.map Complex.re) i j; All goals completed! 🐙endsectionomit [DecidableEq n]lemma map_re_mul (Z W : Matrix n n ) : (Z * W).map Complex.re = Z.map Complex.re * W.map Complex.re - Z.map Complex.im * W.map Complex.im := n:Type u_1inst✝:Fintype nZ:Matrix n n W:Matrix n n (Z * W).map Complex.re = Z.map Complex.re * W.map Complex.re - Z.map Complex.im * W.map Complex.im n:Type u_1inst✝:Fintype nZ:Matrix n n W:Matrix n n i:nj:n(Z * W).map Complex.re i j = (Z.map Complex.re * W.map Complex.re - Z.map Complex.im * W.map Complex.im) i j All goals completed! 🐙lemma map_im_mul (Z W : Matrix n n ) : (Z * W).map Complex.im = Z.map Complex.re * W.map Complex.im + Z.map Complex.im * W.map Complex.re := n:Type u_1inst✝:Fintype nZ:Matrix n n W:Matrix n n (Z * W).map Complex.im = Z.map Complex.re * W.map Complex.im + Z.map Complex.im * W.map Complex.re n:Type u_1inst✝:Fintype nZ:Matrix n n W:Matrix n n i:nj:n(Z * W).map Complex.im i j = (Z.map Complex.re * W.map Complex.im + Z.map Complex.im * W.map Complex.re) i j All goals completed! 🐙

The real part of a complex commutator, arranged as a difference of two real commutators.

n:Type u_1inst✝:Fintype nZ:Matrix n n W:Matrix n n Z.map Complex.re * W.map Complex.re - Z.map Complex.im * W.map Complex.im - (W.map Complex.re * Z.map Complex.re - W.map Complex.im * Z.map Complex.im) = Z.map Complex.re * W.map Complex.re - W.map Complex.re * Z.map Complex.re - (Z.map Complex.im * W.map Complex.im - W.map Complex.im * Z.map Complex.im) All goals completed! 🐙

The imaginary part of a complex commutator, arranged as a sum of two real commutators.

n:Type u_1inst✝:Fintype nZ:Matrix n n W:Matrix n n Z.map Complex.re * W.map Complex.im + Z.map Complex.im * W.map Complex.re - (W.map Complex.re * Z.map Complex.im + W.map Complex.im * Z.map Complex.re) = Z.map Complex.re * W.map Complex.im - W.map Complex.im * Z.map Complex.re + (Z.map Complex.im * W.map Complex.re - W.map Complex.re * Z.map Complex.im) All goals completed! 🐙end

The action of the complexified Lie algebra 𝔤𝔩 n ℂ of GL n ℝ on the C^∞ functions: X + i Y acts as lieDeriv X + i • lieDeriv Y.

noncomputable def lieDerivC (Z : Matrix n n ) : Module.End (smoothGL n) := lieDeriv (Z.map Complex.re) + Complex.I lieDeriv (Z.map Complex.im)lemma lieDerivC_add (Z W : Matrix n n ) : lieDerivC (Z + W) = lieDerivC Z + lieDerivC W := n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nZ:Matrix n n W:Matrix n n lieDerivC (Z + W) = lieDerivC Z + lieDerivC W n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nZ:Matrix n n W:Matrix n n lieDeriv (Z.map Complex.re) + lieDeriv (W.map Complex.re) + (Complex.I lieDeriv (Z.map Complex.im) + Complex.I lieDeriv (W.map Complex.im)) = lieDeriv (Z.map Complex.re) + Complex.I lieDeriv (Z.map Complex.im) + (lieDeriv (W.map Complex.re) + Complex.I lieDeriv (W.map Complex.im)) All goals completed! 🐙n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nc:Z:Matrix n n key: (a b : ) (W : Matrix n n ), lieDerivC ((a + b * Complex.I) W) = (a + b * Complex.I) lieDerivC WlieDerivC (c Z) = c lieDerivC Z All goals completed! 🐙n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nZ:Matrix n n W:Matrix n n lieDeriv (Z.map Complex.re * W.map Complex.re - W.map Complex.re * Z.map Complex.re) - lieDeriv (Z.map Complex.im * W.map Complex.im - W.map Complex.im * Z.map Complex.im) + Complex.I (lieDeriv (Z.map Complex.re * W.map Complex.im - W.map Complex.im * Z.map Complex.re) + lieDeriv (Z.map Complex.im * W.map Complex.re - W.map Complex.re * Z.map Complex.im)) = (lieDeriv (Z.map Complex.re) + Complex.I lieDeriv (Z.map Complex.im)) * (lieDeriv (W.map Complex.re) + Complex.I lieDeriv (W.map Complex.im)) - (lieDeriv (W.map Complex.re) + Complex.I lieDeriv (W.map Complex.im)) * (lieDeriv (Z.map Complex.re) + Complex.I lieDeriv (Z.map Complex.im)) n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nZ:Matrix n n W:Matrix n n lieDeriv (Z.map Complex.re) * lieDeriv (W.map Complex.re) - lieDeriv (W.map Complex.re) * lieDeriv (Z.map Complex.re) - (lieDeriv (Z.map Complex.im) * lieDeriv (W.map Complex.im) - lieDeriv (W.map Complex.im) * lieDeriv (Z.map Complex.im)) + (Complex.I (lieDeriv (Z.map Complex.re) * lieDeriv (W.map Complex.im) - lieDeriv (W.map Complex.im) * lieDeriv (Z.map Complex.re)) + Complex.I (lieDeriv (Z.map Complex.im) * lieDeriv (W.map Complex.re) - lieDeriv (W.map Complex.re) * lieDeriv (Z.map Complex.im))) = lieDeriv (Z.map Complex.re) * lieDeriv (W.map Complex.re) + Complex.I (lieDeriv (Z.map Complex.im) * lieDeriv (W.map Complex.re)) + (Complex.I (lieDeriv (Z.map Complex.re) * lieDeriv (W.map Complex.im)) + (Complex.I * Complex.I) (lieDeriv (Z.map Complex.im) * lieDeriv (W.map Complex.im))) - (lieDeriv (W.map Complex.re) * lieDeriv (Z.map Complex.re) + Complex.I (lieDeriv (W.map Complex.im) * lieDeriv (Z.map Complex.re)) + (Complex.I (lieDeriv (W.map Complex.re) * lieDeriv (Z.map Complex.im)) + (Complex.I * Complex.I) (lieDeriv (W.map Complex.im) * lieDeriv (Z.map Complex.im)))) n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nZ:Matrix n n W:Matrix n n 1 = 1n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nZ:Matrix n n W:Matrix n n -1 = -1n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nZ:Matrix n n W:Matrix n n -1 = Complex.I * Complex.I * 1n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nZ:Matrix n n W:Matrix n n - -1 = -(Complex.I * Complex.I * 1)n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nZ:Matrix n n W:Matrix n n Complex.I * 1 = Complex.I * 1n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nZ:Matrix n n W:Matrix n n Complex.I * -1 = -(Complex.I * 1)n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nZ:Matrix n n W:Matrix n n Complex.I * 1 = Complex.I * 1n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nZ:Matrix n n W:Matrix n n Complex.I * -1 = -(Complex.I * 1) all_goals All goals completed! 🐙 all_goals (try n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nZ:Matrix n n W:Matrix n n 1 = - -1) all_goals All goals completed! 🐙end Smoothend Matrix.GeneralLinearGroup