@@ -519,30 +519,69 @@ end Topology
519519
520520section 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
525527polynomially bounded. -/
526528def _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
547586lemma _root_.Function.HasTemperateGrowth.of_fderiv {f : E → F}
548587 (h'f : Function.HasTemperateGrowth (fderiv ℝ f)) (hf : Differentiable ℝ f) {k : ℕ} {C : ℝ}
0 commit comments