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:m⊢ i ∉ 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.univ⊢ A 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! 🐙