@@ -9,7 +9,7 @@ import Mathlib.Analysis.Calculus.LineDeriv.Basic
99import Mathlib.Analysis.LocallyConvex.WithSeminorms
1010import Mathlib.Analysis.Normed.Group.ZeroAtInfty
1111import Mathlib.Analysis.SpecialFunctions.Pow.Real
12- import Mathlib.Analysis.SpecialFunctions.JapaneseBracket
12+ import Mathlib.Analysis.Distribution.TemperateGrowth
1313import Mathlib.Topology.Algebra.UniformFilterBasis
1414import Mathlib.MeasureTheory.Integral.IntegralEqImproper
1515import Mathlib.Tactic.MoveAdd
@@ -518,230 +518,11 @@ instance instFirstCountableTopology : FirstCountableTopology 𝓢(E, F) :=
518518
519519end Topology
520520
521- section TemperateGrowth
522-
523- open Asymptotics
524-
525- /-! ### Functions of temperate growth -/
526-
527- /-- A function is called of temperate growth if it is smooth and all iterated derivatives are
528- polynomially bounded. -/
529- def _root_.Function.HasTemperateGrowth (f : E → F) : Prop :=
530- ContDiff ℝ ∞ f ∧ ∀ n : ℕ, ∃ (k : ℕ) (C : ℝ), ∀ x, ‖iteratedFDeriv ℝ n f x‖ ≤ C * (1 + ‖x‖) ^ k
531-
532- /-- A function has temperate growth if and only if it is smooth and its `n`-th iterated
533- derivative is `O((1 + ‖x‖) ^ k)` for some `k : ℕ` (depending on `n`).
534-
535- Note that the `O` here is with respect to the `⊤` filter, meaning that the bound holds everywhere.
536-
537- TODO: when `E` is finite dimensional, this is equivalent to the derivatives being `O(‖x‖ ^ k)`
538- as `‖x‖ → ∞`.
539- -/
540- theorem _root_.Function.hasTemperateGrowth_iff_isBigO {f : E → F} :
541- f.HasTemperateGrowth ↔ ContDiff ℝ ∞ f ∧
542- ∀ n, ∃ k, iteratedFDeriv ℝ n f =O[⊤] (fun x ↦ (1 + ‖x‖) ^ k):= by
543- simp_rw [Asymptotics.isBigO_top]
544- congrm ContDiff ℝ ∞ f ∧ (∀ n, ∃ k C, ∀ x, _ ≤ C * ?_)
545- rw [norm_pow, Real.norm_of_nonneg (by positivity)]
546-
547- /-- If `f` as temperate growth, then its `n`-th iterated derivative is `O((1 + ‖x‖) ^ k)` for
548- some `k : ℕ` (depending on `n`).
549-
550- Note that the `O` here is with respect to the `⊤` filter, meaning that the bound holds everywhere.
551- -/
552- theorem _root_.Function.HasTemperateGrowth.isBigO {f : E → F}
553- (hf_temperate : f.HasTemperateGrowth) (n : ℕ) :
554- ∃ k, iteratedFDeriv ℝ n f =O[⊤] (fun x ↦ (1 + ‖x‖) ^ k) :=
555- Function.hasTemperateGrowth_iff_isBigO.mp hf_temperate |>.2 n
556-
557- /-- If `f` as temperate growth, then for any `N : ℕ` one can find `k` such that *all* iterated
558- derivatives of `f` of order `≤ N` are `O((1 + ‖x‖) ^ k)`.
559-
560- Note that the `O` here is with respect to the `⊤` filter, meaning that the bound holds everywhere.
561- -/
562- theorem _root_.Function.HasTemperateGrowth.isBigO_uniform {f : E → F}
563- (hf_temperate : f.HasTemperateGrowth) (N : ℕ) :
564- ∃ k, ∀ n ≤ N, iteratedFDeriv ℝ n f =O[⊤] (fun x ↦ (1 + ‖x‖) ^ k) := by
565- choose k hk using hf_temperate.isBigO
566- use (Finset.range (N + 1 )).sup k
567- intro n hn
568- refine (hk n).trans (isBigO_of_le _ fun x ↦ ?_)
569- rw [Real.norm_of_nonneg (by positivity), Real.norm_of_nonneg (by positivity)]
570- gcongr
571- · simp
572- · exact Finset.le_sup (by simpa [← Finset.mem_range_succ_iff] using hn)
573-
574- theorem _root_.Function.HasTemperateGrowth.norm_iteratedFDeriv_le_uniform_aux {f : E → F}
575- (hf_temperate : f.HasTemperateGrowth) (n : ℕ) :
576- ∃ (k : ℕ) (C : ℝ), 0 ≤ C ∧ ∀ N ≤ n, ∀ x : E, ‖iteratedFDeriv ℝ N f x‖ ≤ C * (1 + ‖x‖) ^ k := by
577- rcases hf_temperate.isBigO_uniform n with ⟨k, hk⟩
578- set F := fun x (N : Fin (n+1 )) ↦ iteratedFDeriv ℝ N f x
579- have : F =O[⊤] (fun x ↦ (1 + ‖x‖) ^ k) := by
580- simp_rw [F, isBigO_pi, Fin.forall_iff, Nat.lt_succ]
581- exact hk
582- rcases this.exists_nonneg with ⟨C, C_nonneg, hC⟩
583- simp (discharger := positivity) only [isBigOWith_top, Real.norm_of_nonneg,
584- pi_norm_le_iff_of_nonneg, Fin.forall_iff, Nat.lt_succ] at hC
585- exact ⟨k, C, C_nonneg, fun N hN x ↦ hC x N hN⟩
586-
587- lemma _root_.Function.HasTemperateGrowth.of_fderiv {f : E → F}
588- (h'f : Function.HasTemperateGrowth (fderiv ℝ f)) (hf : Differentiable ℝ f) {k : ℕ} {C : ℝ}
589- (h : ∀ x, ‖f x‖ ≤ C * (1 + ‖x‖) ^ k) :
590- Function.HasTemperateGrowth f := by
591- refine ⟨contDiff_succ_iff_fderiv.2 ⟨hf, by simp, h'f.1 ⟩, fun n ↦ ?_⟩
592- rcases n with rfl | m
593- · exact ⟨k, C, fun x ↦ by simpa using h x⟩
594- · rcases h'f.2 m with ⟨k', C', h'⟩
595- refine ⟨k', C', ?_⟩
596- simpa [iteratedFDeriv_succ_eq_comp_right] using h'
597-
598- lemma _root_.Function.HasTemperateGrowth.zero :
599- Function.HasTemperateGrowth (fun _ : E ↦ (0 : F)) := by
600- refine ⟨contDiff_const, fun n ↦ ⟨0 , 0 , fun x ↦ ?_⟩⟩
601- simp only [iteratedFDeriv_zero_fun, Pi.zero_apply, norm_zero]
602- positivity
603-
604- lemma _root_.Function.HasTemperateGrowth.const (c : F) :
605- Function.HasTemperateGrowth (fun _ : E ↦ c) :=
606- .of_fderiv (by simpa using .zero) (differentiable_const c) (k := 0 ) (C := ‖c‖) (fun x ↦ by simp)
607-
608- lemma _root_.ContinuousLinearMap.hasTemperateGrowth (f : E →L[ℝ] F) :
609- Function.HasTemperateGrowth f := by
610- apply Function.HasTemperateGrowth.of_fderiv ?_ f.differentiable (k := 1 ) (C := ‖f‖) (fun x ↦ ?_)
611- · have : fderiv ℝ f = fun _ ↦ f := by ext1 v; simp only [ContinuousLinearMap.fderiv]
612- simpa [this] using .const _
613- · exact (f.le_opNorm x).trans (by simp [mul_add])
614-
615521theorem hasTemperateGrowth (f : 𝓢(E, F)) : Function.HasTemperateGrowth f := by
616522 refine ⟨smooth f ⊤, fun n => ?_⟩
617523 rcases f.decay 0 n with ⟨C, Cpos, hC⟩
618524 exact ⟨0 , C, by simpa using hC⟩
619525
620- variable [NormedAddCommGroup D] [MeasurableSpace D]
621-
622- open MeasureTheory Module
623- open scoped ENNReal
624-
625- /-- A measure `μ` has temperate growth if there is an `n : ℕ` such that `(1 + ‖x‖) ^ (- n)` is
626- `μ`-integrable. -/
627- class _root_.MeasureTheory.Measure.HasTemperateGrowth (μ : Measure D) : Prop where
628- exists_integrable : ∃ (n : ℕ), Integrable (fun x ↦ (1 + ‖x‖) ^ (- (n : ℝ))) μ
629-
630- open Classical in
631- /-- An integer exponent `l` such that `(1 + ‖x‖) ^ (-l)` is integrable if `μ` has
632- temperate growth. -/
633- def _root_.MeasureTheory.Measure.integrablePower (μ : Measure D) : ℕ :=
634- if h : μ.HasTemperateGrowth then h.exists_integrable.choose else 0
635-
636- lemma integrable_pow_neg_integrablePower
637- (μ : Measure D) [h : μ.HasTemperateGrowth] :
638- Integrable (fun x ↦ (1 + ‖x‖) ^ (- (μ.integrablePower : ℝ))) μ := by
639- simpa [Measure.integrablePower, h] using h.exists_integrable.choose_spec
640-
641- instance _root_.MeasureTheory.Measure.IsFiniteMeasure.instHasTemperateGrowth {μ : Measure D}
642- [h : IsFiniteMeasure μ] : μ.HasTemperateGrowth := ⟨⟨0 , by simp⟩⟩
643-
644- variable [NormedSpace ℝ D] [FiniteDimensional ℝ D] [BorelSpace D] in
645- instance _root_.MeasureTheory.Measure.IsAddHaarMeasure.instHasTemperateGrowth {μ : Measure D}
646- [h : μ.IsAddHaarMeasure] : μ.HasTemperateGrowth :=
647- ⟨⟨finrank ℝ D + 1 , by apply integrable_one_add_norm; norm_num⟩⟩
648-
649- /-- Pointwise inequality to control `x ^ k * f` in terms of `1 / (1 + x) ^ l` if one controls both
650- `f` (with a bound `C₁`) and `x ^ (k + l) * f` (with a bound `C₂`). This will be used to check
651- integrability of `x ^ k * f x` when `f` is a Schwartz function, and to control explicitly its
652- integral in terms of suitable seminorms of `f`. -/
653- lemma pow_mul_le_of_le_of_pow_mul_le {C₁ C₂ : ℝ} {k l : ℕ} {x f : ℝ} (hx : 0 ≤ x) (hf : 0 ≤ f)
654- (h₁ : f ≤ C₁) (h₂ : x ^ (k + l) * f ≤ C₂) :
655- x ^ k * f ≤ 2 ^ l * (C₁ + C₂) * (1 + x) ^ (- (l : ℝ)) := by
656- have : 0 ≤ C₂ := le_trans (by positivity) h₂
657- have : 2 ^ l * (C₁ + C₂) * (1 + x) ^ (- (l : ℝ)) = ((1 + x) / 2 ) ^ (-(l : ℝ)) * (C₁ + C₂) := by
658- rw [Real.div_rpow (by linarith) zero_le_two]
659- simp [div_eq_inv_mul, ← Real.rpow_neg_one, ← Real.rpow_mul]
660- ring
661- rw [this]
662- rcases le_total x 1 with h'x|h'x
663- · gcongr
664- · apply (pow_le_one₀ hx h'x).trans
665- apply Real.one_le_rpow_of_pos_of_le_one_of_nonpos
666- · linarith
667- · linarith
668- · simp
669- · linarith
670- · calc
671- x ^ k * f = x ^ (-(l : ℝ)) * (x ^ (k + l) * f) := by
672- rw [← Real.rpow_natCast, ← Real.rpow_natCast, ← mul_assoc, ← Real.rpow_add (by linarith)]
673- simp
674- _ ≤ ((1 + x) / 2 ) ^ (-(l : ℝ)) * (C₁ + C₂) := by
675- apply mul_le_mul _ _ (by positivity) (by positivity)
676- · exact Real.rpow_le_rpow_of_nonpos (by linarith) (by linarith) (by simp)
677- · exact h₂.trans (by linarith)
678-
679- variable [BorelSpace D] [SecondCountableTopology D] in
680- /-- Given a function such that `f` and `x ^ (k + l) * f` are bounded for a suitable `l`, then
681- `x ^ k * f` is integrable. The bounds are not relevant for the integrability conclusion, but they
682- are relevant for bounding the integral in `integral_pow_mul_le_of_le_of_pow_mul_le`. We formulate
683- the two lemmas with the same set of assumptions for ease of applications. -/
684- -- We redeclare `E` here to avoid the `NormedSpace ℝ E` typeclass available throughout this file.
685- lemma integrable_of_le_of_pow_mul_le
686- {E : Type *} [NormedAddCommGroup E]
687- {μ : Measure D} [μ.HasTemperateGrowth] {f : D → E} {C₁ C₂ : ℝ} {k : ℕ}
688- (hf : ∀ x, ‖f x‖ ≤ C₁) (h'f : ∀ x, ‖x‖ ^ (k + μ.integrablePower) * ‖f x‖ ≤ C₂)
689- (h''f : AEStronglyMeasurable f μ) :
690- Integrable (fun x ↦ ‖x‖ ^ k * ‖f x‖) μ := by
691- apply ((integrable_pow_neg_integrablePower μ).const_mul (2 ^ μ.integrablePower * (C₁ + C₂))).mono'
692- · exact AEStronglyMeasurable.mul (aestronglyMeasurable_id.norm.pow _) h''f.norm
693- · filter_upwards with v
694- simp only [norm_mul, norm_pow, norm_norm]
695- apply pow_mul_le_of_le_of_pow_mul_le (norm_nonneg _) (norm_nonneg _) (hf v) (h'f v)
696-
697- /-- Given a function such that `f` and `x ^ (k + l) * f` are bounded for a suitable `l`, then
698- one can bound explicitly the integral of `x ^ k * f`. -/
699- -- We redeclare `E` here to avoid the `NormedSpace ℝ E` typeclass available throughout this file.
700- lemma integral_pow_mul_le_of_le_of_pow_mul_le
701- {E : Type *} [NormedAddCommGroup E]
702- {μ : Measure D} [μ.HasTemperateGrowth] {f : D → E} {C₁ C₂ : ℝ} {k : ℕ}
703- (hf : ∀ x, ‖f x‖ ≤ C₁) (h'f : ∀ x, ‖x‖ ^ (k + μ.integrablePower) * ‖f x‖ ≤ C₂) :
704- ∫ x, ‖x‖ ^ k * ‖f x‖ ∂μ ≤ 2 ^ μ.integrablePower *
705- (∫ x, (1 + ‖x‖) ^ (- (μ.integrablePower : ℝ)) ∂μ) * (C₁ + C₂) := by
706- rw [← integral_const_mul, ← integral_mul_const]
707- apply integral_mono_of_nonneg
708- · filter_upwards with v using by positivity
709- · exact ((integrable_pow_neg_integrablePower μ).const_mul _).mul_const _
710- filter_upwards with v
711- exact (pow_mul_le_of_le_of_pow_mul_le (norm_nonneg _) (norm_nonneg _) (hf v) (h'f v)).trans
712- (le_of_eq (by ring))
713-
714- /-- For any `HasTemperateGrowth` measure and `p`, there exists an integer power `k` such that
715- `(1 + ‖x‖) ^ (-k)` is in `L^p`. -/
716- theorem _root_.MeasureTheory.Measure.HasTemperateGrowth.exists_eLpNorm_lt_top (p : ℝ≥0 ∞)
717- {μ : Measure D} (hμ : μ.HasTemperateGrowth) :
718- ∃ k : ℕ, eLpNorm (fun x ↦ (1 + ‖x‖) ^ (-k : ℝ)) p μ < ⊤ := by
719- cases p with
720- | top => exact ⟨0 , eLpNormEssSup_lt_top_of_ae_bound (C := 1 ) (by simp)⟩
721- | coe p =>
722- cases eq_or_ne (p : ℝ≥0 ∞) 0 with
723- | inl hp => exact ⟨0 , by simp [hp]⟩
724- | inr hp =>
725- have h_one_add (x : D) : 0 < 1 + ‖x‖ := lt_add_of_pos_of_le zero_lt_one (norm_nonneg x)
726- have hp_pos : 0 < (p : ℝ) := by simpa [zero_lt_iff] using hp
727- rcases hμ.exists_integrable with ⟨l, hl⟩
728- let k := ⌈(l / p : ℝ)⌉₊
729- have hlk : l ≤ k * (p : ℝ) := by simpa [div_le_iff₀ hp_pos] using Nat.le_ceil (l / p : ℝ)
730- use k
731- suffices HasFiniteIntegral (fun x ↦ ((1 + ‖x‖) ^ (-(k * p) : ℝ))) μ by
732- rw [hasFiniteIntegral_iff_enorm] at this
733- rw [eLpNorm_lt_top_iff_lintegral_rpow_enorm_lt_top hp ENNReal.coe_ne_top]
734- simp only [ENNReal.coe_toReal]
735- refine Eq.subst (motive := (∫⁻ x, · x ∂μ < ⊤)) (funext fun x ↦ ?_) this
736- rw [← neg_mul, Real.rpow_mul (h_one_add x).le]
737- exact Real.enorm_rpow_of_nonneg (by positivity) NNReal.zero_le_coe
738- refine hl.hasFiniteIntegral.mono' (ae_of_all μ fun x ↦ ?_)
739- rw [Real.norm_of_nonneg (Real.rpow_nonneg (h_one_add x).le _)]
740- gcongr
741- simp
742-
743- end TemperateGrowth
744-
745526section HasCompactSupport
746527
747528/-- A smooth compactly supported function is a Schwartz function. -/
0 commit comments