Imports
/- Copyright (c) 2025 Matteo Cipollina. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Matteo Cipollina -/ module public import Mathlib.Analysis.Complex.Polynomial.Basic public import Mathlib.Analysis.Normed.Algebra.MatrixExponential public import Physlib.Mathematics.SchurTriangulation

Lie's Trace Formula

This file proves the formula det (exp A) = exp (tr A) for matrices, also known as Lie's trace formula.

The proof proceeds by first showing the formula for upper-triangular matrices and then leveraging Schur triangulation to generalize to any matrix. An upper-triangular matrix A is defined in mathlib as Matrix.BlockTriangular A id.

Main results

    Matrix.det_exp: The determinant of the exponential of a matrix is the exponential of its trace.

@[expose] public sectioninstance [UniformSpace 𝕂] : UniformSpace (Matrix m n 𝕂) := 𝕂:Type u_1m:Type u_2n:Type u_3inst✝:UniformSpace 𝕂UniformSpace (Matrix m n 𝕂) 𝕂:Type u_1m:Type u_2n:Type u_3inst✝:UniformSpace 𝕂UniformSpace (m n 𝕂); All goals completed! 🐙

If every term of a series is zero, then its sum is zero.

lemma tsum_eq_zero {β : Type*} [TopologicalSpace β] [AddCommMonoid β] {f : β} (h : n, f n = 0) : (∑' n, f n) = 0 := β:Type u_4inst✝¹:TopologicalSpace βinst✝:AddCommMonoid βf: βh: (n : ), f n = 0∑' (n : ), f n = 0 All goals completed! 🐙

The determinant of the matrix exponential

attribute [local instance] Matrix.linftyOpNormedAlgebraattribute [local instance] Matrix.linftyOpNormedRingattribute [local instance] Matrix.instCompleteSpace

Apply a matrix tsum to a given entry.

All goals completed! 🐙

For upper-triangular matrices, the diagonal of a product is the product of the diagonals. This is a specific case of a more general property for block-triangular matrices.

All goals completed! 🐙 -- i < j 𝕂:Type u_1m:Type u_2inst✝²:RCLike 𝕂inst✝¹:Fintype minst✝:LinearOrder mA:Matrix m m 𝕂B:Matrix m m 𝕂hA:A.BlockTriangular idhB:B.BlockTriangular idi:mi Finset.univ A i i * B i i = 0 𝕂:Type u_1m:Type u_2inst✝²:RCLike 𝕂inst✝¹:Fintype minst✝:LinearOrder mA:Matrix m m 𝕂B:Matrix m m 𝕂hA:A.BlockTriangular idhB:B.BlockTriangular idi:ma✝:i Finset.univA i i * B i i = 0; All goals completed! 🐙

Powers of block triangular matrices are block triangular.

𝕂:Type u_1m:Type u_2inst✝²:RCLike 𝕂inst✝¹:Fintype minst✝:LinearOrder mA:Matrix m m 𝕂hA:A.BlockTriangular idk:ihk:(A ^ k).BlockTriangular id(A ^ k * A).BlockTriangular id; All goals completed! 🐙

For an upper-triangular matrix, the diagonal of a power is the power of the diagonal.

All goals completed! 🐙

The exponential of an upper-triangular matrix is upper-triangular.

All goals completed! 🐙

For an upper–triangular matrix A, the (i,i) entry of the power A ^ n is simply the n-th power of the original diagonal entry.

lemma diag_pow_entry_eq_pow_diag_entry {A : Matrix m m 𝕂} (hA : BlockTriangular A id) (n : ) (i : m) : (A ^ n) i i = (A i i) ^ n := 𝕂:Type u_1m:Type u_2inst✝²:RCLike 𝕂inst✝¹:Fintype minst✝:LinearOrder mA:Matrix m m 𝕂hA:A.BlockTriangular idn:i:m(A ^ n) i i = A i i ^ n 𝕂:Type u_1m:Type u_2inst✝²:RCLike 𝕂inst✝¹:Fintype minst✝:LinearOrder mA:Matrix m m 𝕂hA:A.BlockTriangular idn:i:mh:(A ^ n).diag = A.diag ^ n(A ^ n) i i = A i i ^ n All goals completed! 🐙

Each term in the matrix exponential series equals the corresponding scalar term on the diagonal

lemma exp_series_diag_term_eq {A : Matrix m m 𝕂} (hA : BlockTriangular A id) (n : ) (i : m) : ((n.factorial : 𝕂)⁻¹ (A ^ n)) i i = (n.factorial : 𝕂)⁻¹ (A i i) ^ n := 𝕂:Type u_1m:Type u_2inst✝²:RCLike 𝕂inst✝¹:Fintype minst✝:LinearOrder mA:Matrix m m 𝕂hA:A.BlockTriangular idn:i:m((↑n.factorial)⁻¹ A ^ n) i i = (↑n.factorial)⁻¹ A i i ^ n All goals completed! 🐙

The diagonal of the matrix exponential series equals the scalar exponential series

lemma matrix_exp_series_diag_eq_scalar_series {A : Matrix m m 𝕂} (hA : BlockTriangular A id) (i : m) : (∑' n, ((n.factorial : 𝕂)⁻¹ (A ^ n)) i i) = ∑' n, (n.factorial : 𝕂)⁻¹ (A i i) ^ n := 𝕂:Type u_1m:Type u_2inst✝²:RCLike 𝕂inst✝¹:Fintype minst✝:LinearOrder mA:Matrix m m 𝕂hA:A.BlockTriangular idi:m∑' (n : ), ((↑n.factorial)⁻¹ A ^ n) i i = ∑' (n : ), (↑n.factorial)⁻¹ A i i ^ n All goals completed! 🐙

The diagonal of the exponential of an upper-triangular matrix A consists of the exponentials of the diagonal entries of A.

All goals completed! 🐙

Lie's trace formula for upper triangular matrices.

𝕂:Type u_1m:Type u_2inst✝²:RCLike 𝕂inst✝¹:Fintype minst✝:LinearOrder mA:Matrix m m 𝕂hA:A.BlockTriangular idh_exp_upper:(NormedSpace.exp A).BlockTriangular idh_diag_exp:(NormedSpace.exp A).diag = fun i => NormedSpace.exp (A i i)NormedSpace.exp (∑ i, A i i) = NormedSpace.exp A.trace All goals completed! 🐙

The trace is invariant under unitary conjugation.

lemma trace_unitary_conj (A : Matrix m m 𝕂) (U : unitaryGroup m 𝕂) : trace ((U : Matrix m m 𝕂) * A * star (U : Matrix m m 𝕂)) = trace A := 𝕂:Type u_1m:Type u_2inst✝²:RCLike 𝕂inst✝¹:Fintype minst✝:LinearOrder mA:Matrix m m 𝕂U:(unitaryGroup m 𝕂)(U * A * star U).trace = A.trace 𝕂:Type u_1m:Type u_2inst✝²:RCLike 𝕂inst✝¹:Fintype minst✝:LinearOrder mA:Matrix m m 𝕂U:(unitaryGroup m 𝕂)h_unitary:star U * U = 1(U * A * star U).trace = A.trace All goals completed! 🐙

The determinant is invariant under unitary conjugation.

𝕂:Type u_1m:Type u_2inst✝²:RCLike 𝕂inst✝¹:Fintype minst✝:LinearOrder mA:Matrix m m 𝕂U:(unitaryGroup m 𝕂)(U * star U * A).det = A.det All goals completed! 🐙

The exponential of a matrix commutes with unitary conjugation.

𝕂:Type u_1m:Type u_2inst✝²:RCLike 𝕂inst✝¹:Fintype minst✝:LinearOrder mA:Matrix m m 𝕂U:(unitaryGroup m 𝕂)Uu:(Matrix m m 𝕂)ˣ := { val := U, inv := star U, val_inv := , inv_val := }NormedSpace.exp (U * A * star U) = U * NormedSpace.exp A * star U 𝕂:Type u_1m:Type u_2inst✝²:RCLike 𝕂inst✝¹:Fintype minst✝:LinearOrder mA:Matrix m m 𝕂U:(unitaryGroup m 𝕂)Uu:(Matrix m m 𝕂)ˣ := { val := U, inv := star U, val_inv := , inv_val := }h_units:NormedSpace.exp (Uu * A * Uu⁻¹) = Uu * NormedSpace.exp A * Uu⁻¹NormedSpace.exp (U * A * star U) = U * NormedSpace.exp A * star U All goals completed! 🐙
All goals completed! 🐙

The determinant of the exponential of a matrix is the exponential of its trace. This is also known as Lie's trace formula.

All goals completed! 🐙
-- `Matrix.map` commutes with an absolutely convergent series. lemma map_tsum {α β m n : Type*} [AddCommMonoid α] [AddCommMonoid β] [TopologicalSpace α] [TopologicalSpace β] [T2Space β] (f : α →+ β) (hf : Continuous f) {s : Matrix m n α} (hs : Summable s) : (∑' k, s k).map f = ∑' k, (s k).map f := α:Type u_4β:Type u_5m:Type u_6n:Type u_7inst✝⁴:AddCommMonoid αinst✝³:AddCommMonoid βinst✝²:TopologicalSpace αinst✝¹:TopologicalSpace βinst✝:T2Space βf:α →+ βhf:Continuous[inst✝², inst✝¹] fs: Matrix m n αhs:Summable s(∑' (k : ), s k).map f = ∑' (k : ), (s k).map f α:Type u_4β:Type u_5m:Type u_6n:Type u_7inst✝⁴:AddCommMonoid αinst✝³:AddCommMonoid βinst✝²:TopologicalSpace αinst✝¹:TopologicalSpace βinst✝:T2Space βf:α →+ βhf:Continuous[inst✝², inst✝¹] fs: Matrix m n αhs:Summable sF:Matrix m n α →+ Matrix m n β := f.mapMatrix(∑' (k : ), s k).map f = ∑' (k : ), (s k).map f α:Type u_4β:Type u_5m:Type u_6n:Type u_7inst✝⁴:AddCommMonoid αinst✝³:AddCommMonoid βinst✝²:TopologicalSpace αinst✝¹:TopologicalSpace βinst✝:T2Space βf:α →+ βhf:Continuous[inst✝², inst✝¹] fs: Matrix m n αhs:Summable sF:Matrix m n α →+ Matrix m n β := f.mapMatrixhF:Continuous[instTopologicalSpaceMatrix, instTopologicalSpaceMatrix] F(∑' (k : ), s k).map f = ∑' (k : ), (s k).map f All goals completed! 🐙attribute [local instance] Matrix.linftyOpNormedAlgebraattribute [local instance] Matrix.linftyOpNormedRingattribute [local instance] Matrix.instCompleteSpacen:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nA:Matrix n n this✝⁶:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝⁵:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝⁴:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis✝³:CompleteSpace (Matrix n n ) := ···this✝²:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝¹:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis:CompleteSpace (Matrix n n ) := ···hs:Summable fun k => (↑k.factorial)⁻¹ A ^ k(∑' (n_1 : ), (↑n_1.factorial)⁻¹ A ^ n_1).map (algebraMap ) = ∑' (n_1 : ), (↑n_1.factorial)⁻¹ A.map (algebraMap ) ^ n_1 erw [n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nA:Matrix n n this✝⁶:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝⁵:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝⁴:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis✝³:CompleteSpace (Matrix n n ) := ···this✝²:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝¹:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis:CompleteSpace (Matrix n n ) := ···hs:Summable fun k => (↑k.factorial)⁻¹ A ^ k∑' (k : ), ((↑k.factorial)⁻¹ A ^ k).map (algebraMap ).toAddMonoidHom = ∑' (n_1 : ), (↑n_1.factorial)⁻¹ A.map (algebraMap ) ^ n_1n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nA:Matrix n n this✝⁶:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝⁵:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝⁴:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis✝³:CompleteSpace (Matrix n n ) := ···this✝²:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝¹:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis:CompleteSpace (Matrix n n ) := ···hs:Summable fun k => (↑k.factorial)⁻¹ A ^ k∑' (k : ), ((↑k.factorial)⁻¹ A ^ k).map (algebraMap ).toAddMonoidHom = ∑' (n_1 : ), (↑n_1.factorial)⁻¹ A.map (algebraMap ) ^ n_1 n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nA:Matrix n n this✝⁶:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝⁵:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝⁴:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis✝³:CompleteSpace (Matrix n n ) := ···this✝²:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝¹:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis:CompleteSpace (Matrix n n ) := ···hs:Summable fun k => (↑k.factorial)⁻¹ A ^ k (b : ), ((↑b.factorial)⁻¹ A ^ b).map (algebraMap ).toAddMonoidHom = (↑b.factorial)⁻¹ A.map (algebraMap ) ^ b n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nA:Matrix n n this✝⁶:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝⁵:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝⁴:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis✝³:CompleteSpace (Matrix n n ) := ···this✝²:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝¹:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis:CompleteSpace (Matrix n n ) := ···hs:Summable fun k => (↑k.factorial)⁻¹ A ^ kk:((↑k.factorial)⁻¹ A ^ k).map (algebraMap ).toAddMonoidHom = (↑k.factorial)⁻¹ A.map (algebraMap ) ^ k erw [n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nA:Matrix n n this✝⁶:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝⁵:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝⁴:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis✝³:CompleteSpace (Matrix n n ) := ···this✝²:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝¹:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis:CompleteSpace (Matrix n n ) := ···hs:Summable fun k => (↑k.factorial)⁻¹ A ^ kk:(↑k.factorial)⁻¹ (A ^ k).map (algebraMap ).toAddMonoidHom = (↑k.factorial)⁻¹ A.map (algebraMap ) ^ kn:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nA:Matrix n n this✝⁶:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝⁵:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝⁴:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis✝³:CompleteSpace (Matrix n n ) := ···this✝²:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝¹:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis:CompleteSpace (Matrix n n ) := ···hs:Summable fun k => (↑k.factorial)⁻¹ A ^ kk: (a : ), (algebraMap ).toAddMonoidHom ((↑k.factorial)⁻¹ a) = (↑k.factorial)⁻¹ (algebraMap ).toAddMonoidHom a n:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nA:Matrix n n this✝⁶:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝⁵:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝⁴:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis✝³:CompleteSpace (Matrix n n ) := ···this✝²:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝¹:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis:CompleteSpace (Matrix n n ) := ···hs:Summable fun k => (↑k.factorial)⁻¹ A ^ kk:(↑k.factorial)⁻¹ A.map (algebraMap ) ^ k = (↑k.factorial)⁻¹ A.map (algebraMap ) ^ kn:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nA:Matrix n n this✝⁶:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝⁵:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝⁴:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis✝³:CompleteSpace (Matrix n n ) := ···this✝²:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝¹:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis:CompleteSpace (Matrix n n ) := ···hs:Summable fun k => (↑k.factorial)⁻¹ A ^ kk: (a : ), (algebraMap ).toAddMonoidHom ((↑k.factorial)⁻¹ a) = (↑k.factorial)⁻¹ (algebraMap ).toAddMonoidHom an:Type u_1inst✝¹:Fintype ninst✝:DecidableEq nA:Matrix n n this✝⁶:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝⁵:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝⁴:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis✝³:CompleteSpace (Matrix n n ) := ···this✝²:SeminormedRing (Matrix n n ) := Matrix.linftyOpSemiNormedRingthis✝¹:NormedRing (Matrix n n ) := Matrix.linftyOpNormedRingthis✝:NormedAlgebra (Matrix n n ) := Matrix.linftyOpNormedAlgebrathis:CompleteSpace (Matrix n n ) := ···hs:Summable fun k => (↑k.factorial)⁻¹ A ^ kk: (a : ), (algebraMap ).toAddMonoidHom ((↑k.factorial)⁻¹ a) = (↑k.factorial)⁻¹ (algebraMap ).toAddMonoidHom a All goals completed! 🐙

Lie's trace formula over ℝ: det(exp(A)) = exp(tr(A)) for any real matrix A. This is proved by transferring the result from ℂ using the naturality of polynomial identities.

n:Type u_1inst✝¹:Fintype ninst✝:LinearOrder nA:Matrix n n A_ℂ:Matrix n n := A.map (algebraMap )h_complex:(algebraMap ) (NormedSpace.exp A).det = (algebraMap ) (Real.exp A.trace)h_trace_comm:A_ℂ.trace = (algebraMap ) A.traceh_det_comm:(algebraMap ) (NormedSpace.exp A).det = (NormedSpace.exp A_ℂ).deth_exp_comm:Complex.exp ((algebraMap ) A.trace) = (algebraMap ) (Real.exp A.trace)(NormedSpace.exp A).det = Real.exp A.trace All goals completed! 🐙