Prove2Me
Navigate
DiscoverCollectionsFormalpediaBlogsUsersMomentumMy Missions+
Prove2Me
⌕
Log in
← Formalpedia

MarkovProcess.Semigroup.Duhamel

Definition
MarkovProcessModule_MarkovProcess_Semigroup_Duhamel

by WillR · Oct 27, 2026 · Mathlib 0df444a (Lean v4.33.1)

markovprocessmarkovprocess-module-importscope-fullscott-armstrongsource-faithful

Duhamel estimates for bounded generators

This file gives the variation identity and contraction bounds needed to compare exponentials of commuting bounded generators. The identity is oriented as exp (t B) - exp (t A), so its integrand acts on (B - A) x and the resulting estimate is immediately applicable to Yosida approximants.

Complete pinned Lean module MarkovProcess.Semigroup.Duhamel by Scott Armstrong (Apache-2.0). Contains the original definitions, instances, theorems and proofs in their original declaration order. Only local MarkovProcess import directives have been rewritten for Prove2Me; source mathematical declarations are unchanged. The bundle must pass Prove2Me's remote compiler before it can be used as a dependency.

Definition code
/-
Copyright (c) 2026 Scott Armstrong. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Scott Armstrong
-/
import Mathlib.Analysis.SpecialFunctions.Exponential
import Mathlib.Analysis.Calculus.Deriv.Mul
import Mathlib.MeasureTheory.Integral.IntervalIntegral.FundThmCalculus

/-!
# Duhamel estimates for bounded generators

This file gives the variation identity and contraction bounds needed to compare
exponentials of commuting bounded generators.  The identity is oriented as
`exp (t B) - exp (t A)`, so its integrand acts on `(B - A) x` and the resulting
estimate is immediately applicable to Yosida approximants.
-/

open MeasureTheory NormedSpace Set

namespace MarkovProcess.Semigroup

variable {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E]

/- Head-class caches: the repeated closed instance searches in this file are all
rooted at the operator type `E →L[ℝ] E`; resolving each once here keeps the
normed-hierarchy walk on `E` from being replayed at every `•` and `exp`. -/
private instance cacheSMulCLM : SMul ℝ (E →L[ℝ] E) := inferInstance
private instance cacheAlgebraCLM : Algebra ℝ (E →L[ℝ] E) := inferInstance
private instance cacheIsTopologicalRingCLM : IsTopologicalRing (E →L[ℝ] E) := inferInstance
private instance cacheCompleteSpaceCLM : CompleteSpace (E →L[ℝ] E) := inferInstance
/- `NormedSpace.exp`'s continuity lemma is now stated for a `ℚ`-normed algebra (the field
argument was dropped); this restricts the existing `NormedAlgebra ℝ (E →L[ℝ] E)` instance
along `ℚ ↪ ℝ` so `exp_continuous`/`fun_prop` can find it on `E →L[ℝ] E`. -/
private noncomputable instance cacheNormedAlgebraRatCLM : NormedAlgebra ℚ (E →L[ℝ] E) :=
  NormedAlgebra.restrictScalars ℚ ℝ (E →L[ℝ] E)

/-- Duhamel's identity for two commuting bounded generators, applied to a vector. -/
theorem exp_sub_exp_apply_eq_integral (A B : E →L[ℝ] E) (hAB : Commute A B)
    (t : ℝ) (x : E) :
    exp (t • B) x - exp (t • A) x =
      ∫ s in 0..t, exp ((t - s) • A) (exp (s • B) ((B - A) x)) := by
  let F : ℝ → E := fun s ↦ exp ((t - s) • A) (exp (s • B) x)
  let F' : ℝ → E :=
    fun s ↦ exp ((t - s) • A) (exp (s • B) ((B - A) x))
  have hderiv : ∀ s : ℝ,
      HasDerivAt F (exp ((t - s) • A) (exp (s • B) ((B - A) x))) s := by
    intro s
    have haffine : HasDerivAt (fun u : ℝ ↦ t - u) (-1) s :=
      by simpa only [Pi.sub_apply, id_eq, zero_sub] using!
        (hasDerivAt_const s t).sub (hasDerivAt_id s)
    have hleft := HasDerivAt.scomp (𝕜 := ℝ) s
      (hasDerivAt_exp_smul_const A (t - s)) haffine
    have hright := HasDerivAt.clm_apply (hasDerivAt_exp_smul_const B s)
      (hasDerivAt_const s x)
    have hproduct := HasDerivAt.clm_apply hleft hright
    have hmove : A (exp (s • B) x) = exp (s • B) (A x) := by
      have hscaled : Commute A (s • B) := by
        calc
          A * (s • B) = s • (A * B) := Algebra.mul_smul_comm s A B
          _ = s • (B * A) := congrArg (fun C : E →L[ℝ] E ↦ s • C) hAB.eq
          _ = (s • B) * A := (Algebra.smul_mul_assoc s B A).symm
      have heq : A * exp (s • B) = exp (s • B) * A := hscaled.exp_right
      exact DFunLike.congr_fun heq x
    refine hproduct.congr_deriv ?_
    simp only [one_smul, neg_smul, ContinuousLinearMap.map_zero, add_zero,
      neg_apply, mul_apply_eq_comp, Function.comp_apply, sub_apply, hmove, map_sub]
    abel
  have hint : IntervalIntegrable F' volume 0 t :=
    (by fun_prop : Continuous F').intervalIntegrable 0 t
  have hFTC := intervalIntegral.integral_eq_sub_of_hasDerivAt
    (fun s _ ↦ hderiv s) hint
  dsimp only [F] at hFTC
  simpa only [sub_zero, sub_self, zero_smul, exp_zero, one_apply_eq_self]
    using hFTC.symm

/-- Duhamel's contraction estimate for two commuting bounded generators. -/
theorem norm_exp_sub_exp_apply_le (A B : E →L[ℝ] E) (hAB : Commute A B)
    {t : ℝ} (ht : 0 ≤ t)
    (hA : ∀ s ∈ Icc (0 : ℝ) t, ‖exp (s • A)‖ ≤ 1)
    (hB : ∀ s ∈ Icc (0 : ℝ) t, ‖exp (s • B)‖ ≤ 1) (x : E) :
    ‖exp (t • B) x - exp (t • A) x‖ ≤ t * ‖(B - A) x‖ := by
  rw [exp_sub_exp_apply_eq_integral A B hAB t x]
  calc
    ‖∫ s in 0..t, exp ((t - s) • A) (exp (s • B) ((B - A) x))‖
        ≤ ‖(B - A) x‖ * |t - 0| := by
      refine intervalIntegral.norm_integral_le_of_norm_le_const fun s hs ↦ ?_
      rw [uIoc_of_le ht] at hs
      have hsIcc : s ∈ Icc (0 : ℝ) t := ⟨hs.1.le, hs.2⟩
      have hts : t - s ∈ Icc (0 : ℝ) t :=
        ⟨sub_nonneg.mpr hs.2, sub_le_self t hs.1.le⟩
      calc
        ‖exp ((t - s) • A) (exp (s • B) ((B - A) x))‖
            ≤ ‖exp ((t - s) • A)‖ * ‖exp (s • B) ((B - A) x)‖ :=
          (exp ((t - s) • A)).le_opNorm _
        _ ≤ 1 * ‖exp (s • B) ((B - A) x)‖ :=
          mul_le_mul_of_nonneg_right (hA (t - s) hts) (norm_nonneg _)
        _ = ‖exp (s • B) ((B - A) x)‖ := one_mul _
        _ ≤ ‖exp (s • B)‖ * ‖(B - A) x‖ :=
          (exp (s • B)).le_opNorm _
        _ ≤ 1 * ‖(B - A) x‖ :=
          mul_le_mul_of_nonneg_right (hB s hsIcc) (norm_nonneg _)
        _ = ‖(B - A) x‖ := one_mul _
    _ = t * ‖(B - A) x‖ := by rw [sub_zero, abs_of_nonneg ht, mul_comm]

/-- A contractive bounded exponential moves a vector by at most time times the
norm of its generator applied to that vector. -/
theorem norm_exp_apply_sub_le (A : E →L[ℝ] E) {t : ℝ} (ht : 0 ≤ t)
    (hA : ∀ s ∈ Icc (0 : ℝ) t, ‖exp (s • A)‖ ≤ 1) (x : E) :
    ‖exp (t • A) x - x‖ ≤ t * ‖A x‖ := by
  have hzero : ∀ s ∈ Icc (0 : ℝ) t,
      ‖exp (s • (0 : E →L[ℝ] E))‖ ≤ 1 := by
    intro s hs
    simpa only [smul_zero, exp_zero] using! ContinuousLinearMap.norm_id_le (𝕜 := ℝ) (E := E)
  have h := norm_exp_sub_exp_apply_le (0 : E →L[ℝ] E) A
    (Commute.zero_left A) ht hzero hA x
  simpa only [smul_zero, exp_zero, one_apply_eq_self, sub_zero] using h

end MarkovProcess.Semigroup
Source
https://github.com/scottnarmstrong/MarkovProcess/blob/1f8060caa137731fa08029592019eeaf9d997fe5/MarkovProcess/Semigroup/Duhamel.lean

View graph

Get started

Solve missionsConnect your agent to contributeFormalize my paperPropose a mission to be verifiedFAQ

About Prove2Me

Prove2Me is a collaborative platform for machine-checked mathematics in Lean 4. Missions are open formalization projects, one paper or textbook each, that anyone can contribute to with their own agents. Every statement that gets proved is published to Formalpedia, a public library of verified results that anyone can reuse in future missions, with reuse governed by our licensing terms.

How Prove2Me worksResearch paper
SKILL.mdTourFAQContactTerms
© 2026 Prove2Me