Imports
/-
Copyright (c) 2026 Adam Bornemann. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Adam Bornemann
-/
module
public import Mathlib.Analysis.Calculus.Deriv.Pow
public import Mathlib.Analysis.Calculus.IteratedDeriv.Lemmas
public import Mathlib.Analysis.Distribution.TemperateGrowth
public import Mathlib.Analysis.Normed.Algebra.GelfandFormulaTemperate growth of the resolvent of a non-real complex number
i. Overview
For z : ℂ with z.im ≠ 0, every real number lies in the ℝ-resolvent set of z, so
Mathlib's algebra resolvent resolvent (R := ℝ) z = fun t : ℝ ↦ Ring.inverse (↑t - z) is a
globally defined, smooth map ℝ → ℂ. Its iterated derivatives have the closed form
(-1)ⁿ · n! · (resolvent z)ⁿ⁺¹ and are globally bounded by n! · (|z.im| ^ (n+1))⁻¹;
consequently the resolvent has temperate growth.
Smoothness and temperate growth are fun_prop lemmas, so composed variants such as the
affine reciprocal t ↦ (z + a·t)⁻¹ = resolvent (-z) (a·t) follow at call sites by
fun_prop.
ii. Key results
mem_resolventSet_of_im_ne_zero / resolventSet_eq_univ : every t : ℝ lies in
resolventSet ℝ z when z.im ≠ 0, i.e. t - z is invertible for all real t.
norm_resolvent_le : the global bound ‖resolvent z t‖ ≤ |z.im|⁻¹.
iteratedDeriv_resolvent : the closed form
iteratedDeriv n (resolvent z) = (-1)ⁿ · n! · (resolvent z)ⁿ⁺¹.
norm_iteratedDeriv_resolvent_le : the explicit derivative bounds
‖iteratedDeriv n (resolvent z) t‖ ≤ n! · (|z.im| ^ (n+1))⁻¹.
contDiff_resolvent, hasTemperateGrowth_resolvent : smoothness and temperate growth
along ℝ, both tagged @[fun_prop].
iii. Table of contents
A. The resolvent of a non-real complex number along ℝ
iv. References
@[expose] public section
A. The resolvent of a non-real complex number along ℝ
Every real number lies in the ℝ-resolvent set of a non-real complex number:
t - z is invertible for all t : ℝ.
z:ℂhz:z.im ≠ 0t:ℝ⊢ (algebraMap ℝ ℂ) t - z ≠ 0
exact fun h ↦ hz (by z:ℂhz:z.im ≠ 0t:ℝh:(algebraMap ℝ ℂ) t - z = 0⊢ z.im = 0 simpa using congrArg Complex.im h All goals completed! 🐙)
The ℝ-resolvent set of a non-real complex number is all of ℝ.
lemma resolventSet_eq_univ (hz : z.im ≠ 0) : resolventSet ℝ z = Set.univ :=
Set.eq_univ_of_forall (mem_resolventSet_of_im_ne_zero hz)
The resolvent is globally bounded by |z.im|⁻¹: the imaginary part of the denominator
t - z is exactly -z.im.
lemma norm_resolvent_le (hz : z.im ≠ 0) (t : ℝ) : ‖resolvent z t‖ ≤ |z.im|⁻¹ := by z:ℂhz:z.im ≠ 0t:ℝ⊢ ‖resolvent z t‖ ≤ |z.im|⁻¹
rw [resolvent, z:ℂhz:z.im ≠ 0t:ℝ⊢ ‖Ring.inverse ((algebraMap ℝ ℂ) t - z)‖ ≤ |z.im|⁻¹ z:ℂhz:z.im ≠ 0t:ℝ⊢ ‖(algebraMap ℝ ℂ) t - z‖⁻¹ ≤ |z.im|⁻¹ Ring.inverse_eq_inv, z:ℂhz:z.im ≠ 0t:ℝ⊢ ‖((algebraMap ℝ ℂ) t - z)⁻¹‖ ≤ |z.im|⁻¹ z:ℂhz:z.im ≠ 0t:ℝ⊢ ‖(algebraMap ℝ ℂ) t - z‖⁻¹ ≤ |z.im|⁻¹ norm_inv z:ℂhz:z.im ≠ 0t:ℝ⊢ ‖(algebraMap ℝ ℂ) t - z‖⁻¹ ≤ |z.im|⁻¹ z:ℂhz:z.im ≠ 0t:ℝ⊢ ‖(algebraMap ℝ ℂ) t - z‖⁻¹ ≤ |z.im|⁻¹] z:ℂhz:z.im ≠ 0t:ℝ⊢ ‖(algebraMap ℝ ℂ) t - z‖⁻¹ ≤ |z.im|⁻¹
exact inv_anti₀ (abs_pos.mpr hz) (by z:ℂhz:z.im ≠ 0t:ℝ⊢ |z.im| ≤ ‖(algebraMap ℝ ℂ) t - z‖ simpa using Complex.abs_im_le_norm ((algebraMap ℝ ℂ) t - z) All goals completed! 🐙)
The resolvent of a non-real complex number is smooth along ℝ.
@[fun_prop]
lemma contDiff_resolvent (hz : z.im ≠ 0) : ContDiff ℝ ∞ (resolvent (R := ℝ) z) := by z:ℂhz:z.im ≠ 0⊢ ContDiff ℝ ∞ (resolvent z)
have : resolvent (R := ℝ) z = fun t : ℝ ↦ ((t : ℂ) - z)⁻¹ := funext fun t ↦ Ring.inverse_eq_inv _ z:ℂhz:z.im ≠ 0this:resolvent z = fun t => (↑t - z)⁻¹⊢ ContDiff ℝ ∞ (resolvent z)
rw [this z:ℂhz:z.im ≠ 0this:resolvent z = fun t => (↑t - z)⁻¹⊢ ContDiff ℝ ∞ fun t => (↑t - z)⁻¹ z:ℂhz:z.im ≠ 0this:resolvent z = fun t => (↑t - z)⁻¹⊢ ContDiff ℝ ∞ fun t => (↑t - z)⁻¹] z:ℂhz:z.im ≠ 0this:resolvent z = fun t => (↑t - z)⁻¹⊢ ContDiff ℝ ∞ fun t => (↑t - z)⁻¹
exact (Complex.ofRealCLM.contDiff.sub contDiff_const).inv fun t ↦
(spectrum.mem_resolventSet_iff.mp (mem_resolventSet_of_im_ne_zero hz t)).ne_zero All goals completed! 🐙
Closed form for the iterated derivatives of the resolvent: the n-th derivative is
(-1)ⁿ · n! · (resolvent z)ⁿ⁺¹.
lemma iteratedDeriv_resolvent (hz : z.im ≠ 0) (n : ℕ) :
iteratedDeriv n (resolvent (R := ℝ) z)
= fun t ↦ (-1) ^ n * (n ! : ℂ) * resolvent z t ^ (n + 1) := by z:ℂhz:z.im ≠ 0n:ℕ⊢ iteratedDeriv n (resolvent z) = fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)
induction n with
| zero => zero z:ℂhz:z.im ≠ 0⊢ iteratedDeriv 0 (resolvent z) = fun t => (-1) ^ 0 * ↑0! * resolvent z t ^ (0 + 1) simp All goals completed! 🐙
| succ n ih => succ z:ℂhz:z.im ≠ 0n:ℕih:iteratedDeriv n (resolvent z) = fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)⊢ iteratedDeriv (n + 1) (resolvent z) = fun t => (-1) ^ (n + 1) * ↑(n + 1)! * resolvent z t ^ (n + 1 + 1)
funext t succ z:ℂhz:z.im ≠ 0n:ℕih:iteratedDeriv n (resolvent z) = fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)t:ℝ⊢ iteratedDeriv (n + 1) (resolvent z) t = (-1) ^ (n + 1) * ↑(n + 1)! * resolvent z t ^ (n + 1 + 1)
have hd := ((spectrum.hasDerivAt_resolvent_const_left
(mem_resolventSet_of_im_ne_zero hz t)).pow (n + 1)).const_mul ((-1) ^ n * (n ! : ℂ)) succ z:ℂhz:z.im ≠ 0n:ℕih:iteratedDeriv n (resolvent z) = fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)t:ℝhd:HasDerivAt (fun y => (-1) ^ n * ↑n ! * (resolvent z ^ (n + 1)) y)
((-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2)) t⊢ iteratedDeriv (n + 1) (resolvent z) t = (-1) ^ (n + 1) * ↑(n + 1)! * resolvent z t ^ (n + 1 + 1)
simp only [Pi.pow_apply] at hd succ z:ℂhz:z.im ≠ 0n:ℕih:iteratedDeriv n (resolvent z) = fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)t:ℝhd:HasDerivAt (fun y => (-1) ^ n * ↑n ! * resolvent z y ^ (n + 1))
((-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2)) t⊢ iteratedDeriv (n + 1) (resolvent z) t = (-1) ^ (n + 1) * ↑(n + 1)! * resolvent z t ^ (n + 1 + 1)
rw [iteratedDeriv_succ, succ z:ℂhz:z.im ≠ 0n:ℕih:iteratedDeriv n (resolvent z) = fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)t:ℝhd:HasDerivAt (fun y => (-1) ^ n * ↑n ! * resolvent z y ^ (n + 1))
((-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2)) t⊢ deriv (iteratedDeriv n (resolvent z)) t = (-1) ^ (n + 1) * ↑(n + 1)! * resolvent z t ^ (n + 1 + 1) succ z:ℂhz:z.im ≠ 0n:ℕih:iteratedDeriv n (resolvent z) = fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)t:ℝhd:HasDerivAt (fun y => (-1) ^ n * ↑n ! * resolvent z y ^ (n + 1))
((-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2)) t⊢ (-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2) =
(-1) ^ (n + 1) * ↑(n + 1)! * resolvent z t ^ (n + 1 + 1) ih, succ z:ℂhz:z.im ≠ 0n:ℕih:iteratedDeriv n (resolvent z) = fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)t:ℝhd:HasDerivAt (fun y => (-1) ^ n * ↑n ! * resolvent z y ^ (n + 1))
((-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2)) t⊢ deriv (fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)) t = (-1) ^ (n + 1) * ↑(n + 1)! * resolvent z t ^ (n + 1 + 1) succ z:ℂhz:z.im ≠ 0n:ℕih:iteratedDeriv n (resolvent z) = fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)t:ℝhd:HasDerivAt (fun y => (-1) ^ n * ↑n ! * resolvent z y ^ (n + 1))
((-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2)) t⊢ (-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2) =
(-1) ^ (n + 1) * ↑(n + 1)! * resolvent z t ^ (n + 1 + 1) hd.deriv succ z:ℂhz:z.im ≠ 0n:ℕih:iteratedDeriv n (resolvent z) = fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)t:ℝhd:HasDerivAt (fun y => (-1) ^ n * ↑n ! * resolvent z y ^ (n + 1))
((-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2)) t⊢ (-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2) =
(-1) ^ (n + 1) * ↑(n + 1)! * resolvent z t ^ (n + 1 + 1)succ z:ℂhz:z.im ≠ 0n:ℕih:iteratedDeriv n (resolvent z) = fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)t:ℝhd:HasDerivAt (fun y => (-1) ^ n * ↑n ! * resolvent z y ^ (n + 1))
((-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2)) t⊢ (-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2) =
(-1) ^ (n + 1) * ↑(n + 1)! * resolvent z t ^ (n + 1 + 1)]succ z:ℂhz:z.im ≠ 0n:ℕih:iteratedDeriv n (resolvent z) = fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)t:ℝhd:HasDerivAt (fun y => (-1) ^ n * ↑n ! * resolvent z y ^ (n + 1))
((-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2)) t⊢ (-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2) =
(-1) ^ (n + 1) * ↑(n + 1)! * resolvent z t ^ (n + 1 + 1)
push_cast [Nat.factorial_succ] succ z:ℂhz:z.im ≠ 0n:ℕih:iteratedDeriv n (resolvent z) = fun t => (-1) ^ n * ↑n ! * resolvent z t ^ (n + 1)t:ℝhd:HasDerivAt (fun y => (-1) ^ n * ↑n ! * resolvent z y ^ (n + 1))
((-1) ^ n * ↑n ! * (↑(n + 1) * resolvent z t ^ (n + 1 - 1) * -resolvent z t ^ 2)) t⊢ (-1) ^ n * ↑n ! * ((↑n + 1) * resolvent z t ^ n * -resolvent z t ^ 2) =
(-1) ^ (n + 1) * ((↑n + 1) * ↑n !) * resolvent z t ^ (n + 1 + 1)
ring All goals completed! 🐙
Every iterated derivative of the resolvent is globally bounded, explicitly by
n! · (|z.im| ^ (n + 1))⁻¹.
lemma norm_iteratedDeriv_resolvent_le (hz : z.im ≠ 0) (n : ℕ) (t : ℝ) :
‖iteratedDeriv n (resolvent z) t‖ ≤ n ! * (|z.im| ^ (n + 1))⁻¹ := by z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ‖iteratedDeriv n (resolvent z) t‖ ≤ ↑n ! * (|z.im| ^ (n + 1))⁻¹
calc
_ = n ! * ‖resolvent z t‖ ^ (n + 1) := by z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ‖iteratedDeriv n (resolvent z) t‖ = ↑n ! * ‖resolvent z t‖ ^ (n + 1) simp [iteratedDeriv_resolvent, hz] All goals completed! 🐙
_ ≤ n ! * (|z.im| ^ (n + 1))⁻¹ := by z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ↑n ! * ‖resolvent z t‖ ^ (n + 1) ≤ ↑n ! * (|z.im| ^ (n + 1))⁻¹
rw [← inv_pow z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ↑n ! * ‖resolvent z t‖ ^ (n + 1) ≤ ↑n ! * |z.im|⁻¹ ^ (n + 1) z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ↑n ! * ‖resolvent z t‖ ^ (n + 1) ≤ ↑n ! * |z.im|⁻¹ ^ (n + 1)] z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ↑n ! * ‖resolvent z t‖ ^ (n + 1) ≤ ↑n ! * |z.im|⁻¹ ^ (n + 1)
gcongr hab z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ‖resolvent z t‖ ≤ |z.im|⁻¹
exact norm_resolvent_le hz t All goals completed! 🐙
The resolvent of a non-real complex number has temperate growth along ℝ.
@[fun_prop]
lemma hasTemperateGrowth_resolvent (hz : z.im ≠ 0) :
Function.HasTemperateGrowth (resolvent (R := ℝ) z) := by z:ℂhz:z.im ≠ 0⊢ Function.HasTemperateGrowth (resolvent z)
refine ⟨contDiff_resolvent hz, fun n ↦ ⟨0, n ! * (|z.im| ^ (n + 1))⁻¹, fun t ↦ ?_⟩⟩ z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ‖iteratedFDeriv ℝ n (resolvent z) t‖ ≤ ↑n ! * (|z.im| ^ (n + 1))⁻¹ * (1 + ‖t‖) ^ 0
rw [norm_iteratedFDeriv_eq_norm_iteratedDeriv, z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ‖iteratedDeriv n (resolvent z) t‖ ≤ ↑n ! * (|z.im| ^ (n + 1))⁻¹ * (1 + ‖t‖) ^ 0 z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ‖iteratedDeriv n (resolvent z) t‖ ≤ ↑n ! * (|z.im| ^ (n + 1))⁻¹ pow_zero, z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ‖iteratedDeriv n (resolvent z) t‖ ≤ ↑n ! * (|z.im| ^ (n + 1))⁻¹ * 1 z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ‖iteratedDeriv n (resolvent z) t‖ ≤ ↑n ! * (|z.im| ^ (n + 1))⁻¹ mul_one z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ‖iteratedDeriv n (resolvent z) t‖ ≤ ↑n ! * (|z.im| ^ (n + 1))⁻¹ z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ‖iteratedDeriv n (resolvent z) t‖ ≤ ↑n ! * (|z.im| ^ (n + 1))⁻¹] z:ℂhz:z.im ≠ 0n:ℕt:ℝ⊢ ‖iteratedDeriv n (resolvent z) t‖ ≤ ↑n ! * (|z.im| ^ (n + 1))⁻¹
exact norm_iteratedDeriv_resolvent_le hz n t All goals completed! 🐙