Skip to content

Commit 111e2f0

Browse files
committed
chore(Analysis/Distribution): split off functions and measures of temperate growth (#30553)
The Schwartz function file reached 1500 lines of code, so it really needs splitting. The only other change is that I added namespaces and moved one lemma into the `MeasureTheory.Measure` namespace to allow for dot-notation.
1 parent 737069e commit 111e2f0

File tree

3 files changed

+241
-220
lines changed

3 files changed

+241
-220
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1698,6 +1698,7 @@ import Mathlib.Analysis.Distribution.AEEqOfIntegralContDiff
16981698
import Mathlib.Analysis.Distribution.ContDiffMapSupportedIn
16991699
import Mathlib.Analysis.Distribution.FourierSchwartz
17001700
import Mathlib.Analysis.Distribution.SchwartzSpace
1701+
import Mathlib.Analysis.Distribution.TemperateGrowth
17011702
import Mathlib.Analysis.Fourier.AddCircle
17021703
import Mathlib.Analysis.Fourier.AddCircleMulti
17031704
import Mathlib.Analysis.Fourier.BoundedContinuousFunctionChar

Mathlib/Analysis/Distribution/SchwartzSpace.lean

Lines changed: 1 addition & 220 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Mathlib.Analysis.Calculus.LineDeriv.Basic
99
import Mathlib.Analysis.LocallyConvex.WithSeminorms
1010
import Mathlib.Analysis.Normed.Group.ZeroAtInfty
1111
import Mathlib.Analysis.SpecialFunctions.Pow.Real
12-
import Mathlib.Analysis.SpecialFunctions.JapaneseBracket
12+
import Mathlib.Analysis.Distribution.TemperateGrowth
1313
import Mathlib.Topology.Algebra.UniformFilterBasis
1414
import Mathlib.MeasureTheory.Integral.IntegralEqImproper
1515
import Mathlib.Tactic.MoveAdd
@@ -518,230 +518,11 @@ instance instFirstCountableTopology : FirstCountableTopology 𝓢(E, F) :=
518518

519519
end 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-
615521
theorem 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-
745526
section HasCompactSupport
746527

747528
/-- A smooth compactly supported function is a Schwartz function. -/

0 commit comments

Comments
 (0)