Skip to content

Commit e11b36c

Browse files
committed
feat: interpret HasTemperateGrowth in terms of IsBigO (#30251)
Prompted by some thinking about #30176
1 parent 6a1dc6b commit e11b36c

File tree

1 file changed

+53
-14
lines changed

1 file changed

+53
-14
lines changed

Mathlib/Analysis/Distribution/SchwartzSpace.lean

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -519,30 +519,69 @@ end Topology
519519

520520
section TemperateGrowth
521521

522+
open Asymptotics
523+
522524
/-! ### Functions of temperate growth -/
523525

524526
/-- A function is called of temperate growth if it is smooth and all iterated derivatives are
525527
polynomially bounded. -/
526528
def _root_.Function.HasTemperateGrowth (f : E → F) : Prop :=
527529
ContDiff ℝ ∞ f ∧ ∀ n : ℕ, ∃ (k : ℕ) (C : ℝ), ∀ x, ‖iteratedFDeriv ℝ n f x‖ ≤ C * (1 + ‖x‖) ^ k
528530

529-
theorem _root_.Function.HasTemperateGrowth.norm_iteratedFDeriv_le_uniform_aux {f : E → F}
531+
/-- A function has temperate growth if and only if it is smooth and its `n`-th iterated
532+
derivative is `O((1 + ‖x‖) ^ k)` for some `k : ℕ` (depending on `n`).
533+
534+
Note that the `O` here is with respect to the `⊤` filter, meaning that the bound holds everywhere.
535+
536+
TODO: when `E` is finite dimensional, this is equivalent to the derivatives being `O(‖x‖ ^ k)`
537+
as `‖x‖ → ∞`.
538+
-/
539+
theorem _root_.Function.hasTemperateGrowth_iff_isBigO {f : E → F} :
540+
f.HasTemperateGrowth ↔ ContDiff ℝ ∞ f ∧
541+
∀ n, ∃ k, iteratedFDeriv ℝ n f =O[⊤] (fun x ↦ (1 + ‖x‖) ^ k):= by
542+
simp_rw [Asymptotics.isBigO_top]
543+
congrm ContDiff ℝ ∞ f ∧ (∀ n, ∃ k C, ∀ x, _ ≤ C * ?_)
544+
rw [norm_pow, Real.norm_of_nonneg (by positivity)]
545+
546+
/-- If `f` as temperate growth, then its `n`-th iterated derivative is `O((1 + ‖x‖) ^ k)` for
547+
some `k : ℕ` (depending on `n`).
548+
549+
Note that the `O` here is with respect to the `⊤` filter, meaning that the bound holds everywhere.
550+
-/
551+
theorem _root_.Function.HasTemperateGrowth.isBigO {f : E → F}
530552
(hf_temperate : f.HasTemperateGrowth) (n : ℕ) :
531-
∃ (k : ℕ) (C : ℝ), 0 ≤ C ∧ ∀ N ≤ n, ∀ x : E, ‖iteratedFDeriv ℝ N f x‖ ≤ C * (1 + ‖x‖) ^ k := by
532-
choose k C f using hf_temperate.2
533-
use (Finset.range (n + 1)).sup k
534-
let C' := max (0 : ℝ) ((Finset.range (n + 1)).sup' (by simp) C)
535-
have hC' : 0 ≤ C' := le_max_left _ _
536-
use C', hC'
537-
intro N hN x
538-
rw [← Finset.mem_range_succ_iff] at hN
539-
grw [f]
553+
∃ k, iteratedFDeriv ℝ n f =O[⊤] (fun x ↦ (1 + ‖x‖) ^ k) :=
554+
Function.hasTemperateGrowth_iff_isBigO.mp hf_temperate |>.2 n
555+
556+
/-- If `f` as temperate growth, then for any `N : ℕ` one can find `k` such that *all* iterated
557+
derivatives of `f` of order `≤ N` are `O((1 + ‖x‖) ^ k)`.
558+
559+
Note that the `O` here is with respect to the `⊤` filter, meaning that the bound holds everywhere.
560+
-/
561+
theorem _root_.Function.HasTemperateGrowth.isBigO_uniform {f : E → F}
562+
(hf_temperate : f.HasTemperateGrowth) (N : ℕ) :
563+
∃ k, ∀ n ≤ N, iteratedFDeriv ℝ n f =O[⊤] (fun x ↦ (1 + ‖x‖) ^ k) := by
564+
choose k hk using hf_temperate.isBigO
565+
use (Finset.range (N + 1)).sup k
566+
intro n hn
567+
refine (hk n).trans (isBigO_of_le _ fun x ↦ ?_)
568+
rw [Real.norm_of_nonneg (by positivity), Real.norm_of_nonneg (by positivity)]
540569
gcongr
541-
· simp only [C', Finset.le_sup'_iff, le_max_iff]
542-
right
543-
exact ⟨N, hN, le_rfl⟩
544570
· simp
545-
exact Finset.le_sup hN
571+
· exact Finset.le_sup (by simpa [← Finset.mem_range_succ_iff] using hn)
572+
573+
theorem _root_.Function.HasTemperateGrowth.norm_iteratedFDeriv_le_uniform_aux {f : E → F}
574+
(hf_temperate : f.HasTemperateGrowth) (n : ℕ) :
575+
∃ (k : ℕ) (C : ℝ), 0 ≤ C ∧ ∀ N ≤ n, ∀ x : E, ‖iteratedFDeriv ℝ N f x‖ ≤ C * (1 + ‖x‖) ^ k := by
576+
rcases hf_temperate.isBigO_uniform n with ⟨k, hk⟩
577+
set F := fun x (N : Fin (n+1)) ↦ iteratedFDeriv ℝ N f x
578+
have : F =O[⊤] (fun x ↦ (1 + ‖x‖) ^ k) := by
579+
simp_rw [F, isBigO_pi, Fin.forall_iff, Nat.lt_succ]
580+
exact hk
581+
rcases this.exists_nonneg with ⟨C, C_nonneg, hC⟩
582+
simp (discharger := positivity) only [isBigOWith_top, Real.norm_of_nonneg,
583+
pi_norm_le_iff_of_nonneg, Fin.forall_iff, Nat.lt_succ] at hC
584+
exact ⟨k, C, C_nonneg, fun N hN x ↦ hC x N hN⟩
546585

547586
lemma _root_.Function.HasTemperateGrowth.of_fderiv {f : E → F}
548587
(h'f : Function.HasTemperateGrowth (fderiv ℝ f)) (hf : Differentiable ℝ f) {k : ℕ} {C : ℝ}

0 commit comments

Comments
 (0)