Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit e137999

Browse files
committed
feat(analysis/schwartz_space): Multiplication of Schwartz function and functions of temperate growth (#18649)
1 parent 00abe06 commit e137999

1 file changed

Lines changed: 181 additions & 0 deletions

File tree

src/analysis/schwartz_space.lean

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ Schwartz space, tempered distributions
5959

6060
noncomputable theory
6161

62+
open_locale big_operators nat
63+
6264
variables {𝕜 𝕜' D E F G : Type*}
6365

6466
variables [normed_add_comm_group E] [normed_space ℝ E]
@@ -518,6 +520,37 @@ instance : topological_space.first_countable_topology (𝓢(E, F)) :=
518520

519521
end topology
520522

523+
section temperate_growth
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.has_temperate_growth (f : E → F) : Prop :=
530+
cont_diff ℝ ⊤ f ∧ ∀ n : ℕ, ∃ (k : ℕ) (C : ℝ), ∀ x, ‖iterated_fderiv ℝ n f x‖ ≤ C * (1 + ‖x‖)^k
531+
532+
lemma _root_.function.has_temperate_growth.norm_iterated_fderiv_le_uniform_aux {f : E → F}
533+
(hf_temperate : f.has_temperate_growth) (n : ℕ) :
534+
∃ (k : ℕ) (C : ℝ) (hC : 0 ≤ C), ∀ (N : ℕ) (hN : N ≤ n) (x : E),
535+
‖iterated_fderiv ℝ N f x‖ ≤ C * (1 + ‖x‖)^k :=
536+
begin
537+
choose k C f using hf_temperate.2,
538+
use (finset.range (n+1)).sup k,
539+
let C' := max (0 : ℝ) ((finset.range (n+1)).sup' (by simp) C),
540+
have hC' : 0 ≤ C' := by simp only [le_refl, finset.le_sup'_iff, true_or, le_max_iff],
541+
use [C', hC'],
542+
intros N hN x,
543+
rw ← finset.mem_range_succ_iff at hN,
544+
refine le_trans (f N x) (mul_le_mul _ _ (by positivity) hC'),
545+
{ simp only [finset.le_sup'_iff, le_max_iff],
546+
right,
547+
exact ⟨N, hN, rfl.le⟩ },
548+
refine pow_le_pow (by simp only [le_add_iff_nonneg_right, norm_nonneg]) _,
549+
exact finset.le_sup hN,
550+
end
551+
552+
end temperate_growth
553+
521554
section clm
522555

523556
/-! ### Construction of continuous linear maps between Schwartz spaces -/
@@ -596,6 +629,154 @@ mk_clm (λ f x, f x m)
596629

597630
end eval_clm
598631

632+
section multiplication
633+
634+
variables [normed_add_comm_group D] [normed_space ℝ D]
635+
variables [normed_add_comm_group G] [normed_space ℝ G]
636+
637+
/-- The map `f ↦ (x ↦ B (f x) (g x))` as a continuous `𝕜`-linear map on Schwartz space,
638+
where `B` is a continuous `𝕜`-linear map and `g` is a function of temperate growth. -/
639+
def bilin_left_clm (B : E →L[ℝ] F →L[ℝ] G) {g : D → F} (hg : g.has_temperate_growth) :
640+
𝓢(D, E) →L[ℝ] 𝓢(D, G) :=
641+
-- Todo (after port): generalize to `B : E →L[𝕜] F →L[𝕜] G` and `𝕜`-linear
642+
mk_clm (λ f x, B (f x) (g x))
643+
(λ _ _ _, by simp only [map_add, add_left_inj, pi.add_apply, eq_self_iff_true,
644+
continuous_linear_map.add_apply])
645+
(λ _ _ _, by simp only [pi.smul_apply, continuous_linear_map.coe_smul',
646+
continuous_linear_map.map_smul, ring_hom.id_apply])
647+
(λ f, (B.is_bounded_bilinear_map.cont_diff.restrict_scalars ℝ).comp (f.smooth'.prod hg.1))
648+
(begin
649+
-- Porting note: rewrite this proof with `rel_congr`
650+
rintro ⟨k, n⟩,
651+
rcases hg.norm_iterated_fderiv_le_uniform_aux n with ⟨l, C, hC, hgrowth⟩,
652+
use [finset.Iic (l+k,n), ‖B‖ * (n + 1) * n.choose (n / 2) * (C * 2^(l + k)), by positivity],
653+
intros f x,
654+
have hxk : 0 ≤ ‖x‖^k := by positivity,
655+
have hnorm_mul :=
656+
continuous_linear_map.norm_iterated_fderiv_le_of_bilinear B f.smooth' hg.1 x le_top,
657+
refine le_trans (mul_le_mul_of_nonneg_left hnorm_mul hxk) _,
658+
rw [← mul_assoc (‖x‖^k), mul_comm (‖x‖^k)],
659+
simp_rw [mul_assoc (‖B‖)],
660+
refine mul_le_mul_of_nonneg_left _ (by positivity),
661+
rw [finset.mul_sum],
662+
have : ∑ (x_1 : ℕ) in finset.range (n + 1), (1 : ℝ) = n + 1 := by simp,
663+
repeat { rw [mul_assoc ((n : ℝ) + 1)] },
664+
rw [← this, finset.sum_mul],
665+
refine finset.sum_le_sum (λ i hi, _),
666+
simp only [one_mul],
667+
rw [← mul_assoc, mul_comm (‖x‖^k), mul_assoc, mul_assoc, mul_assoc],
668+
refine mul_le_mul _ _ (by positivity) (by positivity),
669+
{ norm_cast,
670+
exact i.choose_le_middle n },
671+
specialize hgrowth (n - i) (by simp only [tsub_le_self]) x,
672+
rw [← mul_assoc],
673+
refine le_trans (mul_le_mul_of_nonneg_left hgrowth (by positivity)) _,
674+
rw [mul_comm _ (C * _), mul_assoc, mul_assoc C],
675+
refine mul_le_mul_of_nonneg_left _ hC,
676+
nth_rewrite 1 mul_comm,
677+
rw [← mul_assoc],
678+
rw finset.mem_range_succ_iff at hi,
679+
change i ≤ (l + k, n).snd at hi,
680+
refine le_trans _ (one_add_le_sup_seminorm_apply le_rfl hi f x ),
681+
refine mul_le_mul_of_nonneg_right _ (norm_nonneg _),
682+
rw [pow_add],
683+
refine mul_le_mul_of_nonneg_left _ (by positivity),
684+
refine pow_le_pow_of_le_left (norm_nonneg _) _ _,
685+
simp only [zero_le_one, le_add_iff_nonneg_left],
686+
end)
687+
688+
end multiplication
689+
690+
section comp
691+
692+
variables (𝕜)
693+
variables [is_R_or_C 𝕜]
694+
variables [normed_add_comm_group D] [normed_space ℝ D]
695+
variables [normed_add_comm_group G] [normed_space ℝ G]
696+
variables [normed_space 𝕜 F] [smul_comm_class ℝ 𝕜 F]
697+
variables [normed_space 𝕜 G] [smul_comm_class ℝ 𝕜 G]
698+
699+
/-- Composition with a function on the right is a continuous linear map on Schwartz space
700+
provided that the function is temperate and growths polynomially near infinity. -/
701+
def comp_clm {g : D → E} (hg : g.has_temperate_growth)
702+
(hg_upper : ∃ (k : ℕ) (C : ℝ), ∀ x, ‖x‖ ≤ C * (1 + ‖g x‖)^k ) :
703+
𝓢(E, F) →L[𝕜] 𝓢(D, F) :=
704+
mk_clm (λ f x, (f (g x)))
705+
(λ _ _ _, by simp only [add_left_inj, pi.add_apply, eq_self_iff_true])
706+
(λ _ _ _, rfl)
707+
(λ f, f.smooth'.comp hg.1)
708+
(begin
709+
rintros ⟨k, n⟩,
710+
rcases hg.norm_iterated_fderiv_le_uniform_aux n with ⟨l, C, hC, hgrowth⟩,
711+
rcases hg_upper with ⟨kg, Cg, hg_upper'⟩,
712+
have hCg : 11 + Cg :=
713+
begin
714+
refine le_add_of_nonneg_right _,
715+
specialize hg_upper' 0,
716+
rw [norm_zero] at hg_upper',
717+
refine nonneg_of_mul_nonneg_left hg_upper' (by positivity),
718+
end,
719+
let k' := kg * (k + l * n),
720+
use [finset.Iic (k',n), (1 + Cg) ^ (k + l * n) * ((C + 1) ^ n * n! * 2 ^ k'), by positivity],
721+
intros f x,
722+
let seminorm_f := ((finset.Iic (k',n)).sup (schwartz_seminorm_family 𝕜 _ _)) f,
723+
have hg_upper'' : (1 + ‖x‖)^(k + l * n) ≤ (1 + Cg)^(k + l*n) * (1 + ‖g x‖)^k' :=
724+
begin
725+
rw [pow_mul, ← mul_pow],
726+
refine pow_le_pow_of_le_left (by positivity) _ _,
727+
rw [add_mul],
728+
refine add_le_add _ (hg_upper' x),
729+
nth_rewrite 0 ← one_mul (1 : ℝ),
730+
refine mul_le_mul (le_refl _) (one_le_pow_of_one_le _ _) zero_le_one zero_le_one,
731+
simp only [le_add_iff_nonneg_right, norm_nonneg],
732+
end,
733+
have hbound : ∀ i, i ≤ n → ‖iterated_fderiv ℝ i f (g x)‖ ≤
734+
2 ^ k' * seminorm_f / ((1 + ‖g x‖) ^ k'):=
735+
begin
736+
intros i hi,
737+
have hpos : 0 < (1 + ‖g x‖) ^ k' := by positivity,
738+
rw le_div_iff' hpos,
739+
change i ≤ (k', n).snd at hi,
740+
exact one_add_le_sup_seminorm_apply le_rfl hi _ _,
741+
end,
742+
have hgrowth' : ∀ (N : ℕ) (hN₁ : 1 ≤ N) (hN₂ : N ≤ n),
743+
‖iterated_fderiv ℝ N g x‖ ≤ ((C + 1) * (1 + ‖x‖)^l)^N :=
744+
begin
745+
intros N hN₁ hN₂,
746+
refine (hgrowth N hN₂ x).trans _,
747+
rw [mul_pow],
748+
have hN₁' := (lt_of_lt_of_le zero_lt_one hN₁).ne.symm,
749+
refine mul_le_mul _ _ (by positivity) (by positivity),
750+
{ exact le_trans (by simp [hC]) (le_self_pow (by simp [hC]) hN₁'), },
751+
{ refine le_self_pow (one_le_pow_of_one_le _ l) hN₁',
752+
simp only [le_add_iff_nonneg_right, norm_nonneg] },
753+
end,
754+
have := norm_iterated_fderiv_comp_le f.smooth' hg.1 le_top x hbound hgrowth',
755+
have hxk : ‖x‖^k ≤ (1 + ‖x‖)^k :=
756+
pow_le_pow_of_le_left (norm_nonneg _) (by simp only [zero_le_one, le_add_iff_nonneg_left]) _,
757+
refine le_trans (mul_le_mul hxk this (by positivity) (by positivity)) _,
758+
have rearrange :
759+
(1 + ‖x‖) ^ k * (n! * (2 ^ k' * seminorm_f / (1 + ‖g x‖) ^ k') *
760+
((C + 1) * (1 + ‖x‖) ^ l) ^ n) =
761+
((1 + ‖x‖)^(k + l * n) / (1 + ‖g x‖) ^ k') * ((C + 1)^n * n! * 2^k' * seminorm_f) :=
762+
begin
763+
rw [mul_pow, pow_add, ← pow_mul],
764+
ring,
765+
end,
766+
rw rearrange,
767+
have hgxk' : 0 < (1 + ‖g x‖) ^ k' := by positivity,
768+
rw ← div_le_iff hgxk' at hg_upper'',
769+
have hpos : 0 ≤ (C + 1) ^ n * n! * 2 ^ k' * seminorm_f :=
770+
begin
771+
have : 0 ≤ seminorm_f := map_nonneg _ _,
772+
positivity,
773+
end,
774+
refine le_trans (mul_le_mul_of_nonneg_right hg_upper'' hpos) _,
775+
rw [← mul_assoc],
776+
end)
777+
778+
end comp
779+
599780
section derivatives
600781

601782
/-! ### Derivatives of Schwartz functions -/

0 commit comments

Comments
 (0)