Skip to content

Commit 952587c

Browse files
mcdollocfnash
andcommitted
feat(Analysis): use new notation for Fourier transform on Schwartz functions and simplify presentation (#31114)
Use the new notation for the Fourier transform and its inverse to clean up `FourierSchwartz`. - Use notation type class and `Prop`-type classes. - State all lemmas for the Fourier transform on `SchwartzMap` and not on the coercion to functions. - Add coercion lemmas. - Move `FourierTransformCLE` up in the file and use `FourierEquiv` from the abstract notation file. - Use the notation for the Fourier transform and the Schwartz functions in `PoissonSummation`. - Add my name to the authors list for this PR and the PR for Plancherel's theorem. - Some golfing Co-authored-by: Oliver Nash <7734364+ocfnash@users.noreply.github.com>
1 parent ef91075 commit 952587c

File tree

2 files changed

+96
-60
lines changed

2 files changed

+96
-60
lines changed
Lines changed: 91 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/-
22
Copyright (c) 2024 Sébastien Gouëzel. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: Sébastien Gouëzel
4+
Authors: Sébastien Gouëzel, Moritz Doll
55
-/
66
import Mathlib.Analysis.Distribution.SchwartzSpace
77
import Mathlib.Analysis.Fourier.FourierTransformDeriv
@@ -18,6 +18,8 @@ functions, in `fourierTransformCLM`. It is also given as a continuous linear equ
1818
open Real MeasureTheory MeasureTheory.Measure
1919
open scoped FourierTransform ComplexInnerProductSpace
2020

21+
noncomputable section
22+
2123
namespace SchwartzMap
2224

2325
variable
@@ -28,9 +30,11 @@ variable
2830
{V : Type*} [NormedAddCommGroup V] [InnerProductSpace ℝ V] [FiniteDimensional ℝ V]
2931
[MeasurableSpace V] [BorelSpace V]
3032

33+
section definition
34+
3135
/-- The Fourier transform on a real inner product space, as a continuous linear map on the
3236
Schwartz space. -/
33-
noncomputable def fourierTransformCLM : 𝓢(V, E) →L[𝕜] 𝓢(V, E) := by
37+
def fourierTransformCLM : 𝓢(V, E) →L[𝕜] 𝓢(V, E) := by
3438
refine mkCLM ((𝓕 : (V → E) → (V → E)) ·) ?_ ?_ ?_ ?_
3539
· intro f g x
3640
simp only [fourierIntegral_eq, add_apply, smul_add]
@@ -77,99 +81,129 @@ noncomputable def fourierTransformCLM : 𝓢(V, E) →L[𝕜] 𝓢(V, E) := by
7781
apply Finset.le_sup this (f := fun p ↦ SchwartzMap.seminorm 𝕜 p.1 p.2 (E := V) (F := E))
7882
_ = _ := by simp [mul_assoc]
7983

80-
@[simp] lemma fourierTransformCLM_apply (f : 𝓢(V, E)) :
81-
fourierTransformCLM 𝕜 f = 𝓕 (f : V → E) := rfl
84+
instance instFourierTransform : FourierTransform 𝓢(V, E) 𝓢(V, E) where
85+
fourierTransform f := fourierTransformCLM ℂ f
86+
87+
lemma fourier_coe (f : 𝓢(V, E)) : 𝓕 f = 𝓕 (f : V → E) := rfl
88+
89+
instance instFourierModule : FourierModule 𝕜 𝓢(V, E) 𝓢(V, E) where
90+
fourier_add := ContinuousLinearMap.map_add _
91+
fourier_smul := (fourierTransformCLM 𝕜).map_smul
92+
93+
@[simp]
94+
theorem fourierTransformCLM_apply (f : 𝓢(V, E)) :
95+
fourierTransformCLM 𝕜 f = 𝓕 f := rfl
96+
97+
instance instFourierTransformInv : FourierTransformInv 𝓢(V, E) 𝓢(V, E) where
98+
fourierTransformInv := (compCLMOfContinuousLinearEquiv ℂ (LinearIsometryEquiv.neg ℝ (E := V)))
99+
∘L (fourierTransformCLM ℂ)
100+
101+
lemma fourierInv_coe (f : 𝓢(V, E)) :
102+
𝓕⁻ f = 𝓕⁻ (f : V → E) := by
103+
ext x
104+
exact (fourierIntegralInv_eq_fourierIntegral_neg f x).symm
105+
106+
instance instFourierInvModule : FourierInvModule 𝕜 𝓢(V, E) 𝓢(V, E) where
107+
fourierInv_add := ContinuousLinearMap.map_add _
108+
fourierInv_smul := ((compCLMOfContinuousLinearEquiv 𝕜 (D := V) (E := V) (F := E)
109+
(LinearIsometryEquiv.neg ℝ (E := V))) ∘L (fourierTransformCLM 𝕜)).map_smul
82110

83111
variable [CompleteSpace E]
84112

113+
instance instFourierPair : FourierPair 𝓢(V, E) 𝓢(V, E) where
114+
inv_fourier := by
115+
intro f
116+
ext x
117+
rw [fourierInv_coe, fourier_coe, f.continuous.fourier_inversion f.integrable (𝓕 f).integrable]
118+
119+
instance instFourierInvPair : FourierInvPair 𝓢(V, E) 𝓢(V, E) where
120+
fourier_inv := by
121+
intro f
122+
ext x
123+
rw [fourier_coe, fourierInv_coe, f.continuous.fourier_inversion_inv f.integrable
124+
(𝓕 f).integrable]
125+
126+
@[deprecated (since := "2025-11-13")]
127+
alias fourier_inversion := FourierTransform.inv_fourier
128+
129+
@[deprecated (since := "2025-11-13")]
130+
alias fourier_inversion_inv := FourierTransform.fourier_inv
131+
132+
/-- The Fourier transform on a real inner product space, as a continuous linear equiv on the
133+
Schwartz space. -/
134+
def fourierTransformCLE : 𝓢(V, E) ≃L[𝕜] 𝓢(V, E) where
135+
__ := FourierTransform.fourierEquiv 𝕜 𝓢(V, E) 𝓢(V, E)
136+
continuous_toFun := (fourierTransformCLM 𝕜).continuous
137+
continuous_invFun := ContinuousLinearMap.continuous _
138+
85139
@[simp]
86-
theorem fourier_inversion (f : 𝓢(V, E)) (x : V) : 𝓕⁻ (𝓕 (f : V → E)) x = f x :=
87-
Integrable.fourier_inversion f.integrable (fourierTransformCLM ℂ f).integrable
88-
f.continuous.continuousAt
140+
lemma fourierTransformCLE_apply (f : 𝓢(V, E)) : fourierTransformCLE 𝕜 f = 𝓕 f := rfl
89141

90142
@[simp]
91-
theorem fourier_inversion_inv (f : 𝓢(V, E)) (x : V) : 𝓕 (𝓕⁻ (f : V → E)) x = f x :=
92-
Integrable.fourier_inversion_inv f.integrable (fourierTransformCLM ℂ f).integrable
93-
f.continuous.continuousAt
143+
lemma fourierTransformCLE_symm_apply (f : 𝓢(V, E)) : (fourierTransformCLE 𝕜).symm f = 𝓕⁻ f := rfl
144+
145+
end definition
146+
147+
section fubini
94148

95149
variable
96-
{F : Type*} [NormedAddCommGroup F] [NormedSpace ℂ F] [NormedSpace 𝕜 F] [SMulCommClass ℂ 𝕜 F]
150+
{F : Type*} [NormedAddCommGroup F] [NormedSpace ℂ F]
97151
{G : Type*} [NormedAddCommGroup G] [NormedSpace ℂ G]
98152

99-
variable [CompleteSpace F]
153+
variable [CompleteSpace E] [CompleteSpace F]
100154

101155
/-- The Fourier transform satisfies `∫ 𝓕 f * g = ∫ f * 𝓕 g`, i.e., it is self-adjoint.
102156
Version where the multiplication is replaced by a general bilinear form `M`. -/
103157
theorem integral_bilin_fourierIntegral_eq (f : 𝓢(V, E)) (g : 𝓢(V, F)) (M : E →L[ℂ] F →L[ℂ] G) :
104-
∫ ξ, M (𝓕 (f : V → E) ξ) (g ξ) = ∫ x, M (f x) (𝓕 (g : V → F) x) := by
105-
have := VectorFourier.integral_bilin_fourierIntegral_eq_flip M (μ := volume) (ν := volume)
106-
(L := (innerₗ V)) continuous_fourierChar continuous_inner f.integrable g.integrable
107-
rwa [flip_innerₗ] at this
158+
∫ ξ, M (𝓕 f ξ) (g ξ) = ∫ x, M (f x) (𝓕 g x) := by
159+
simpa using VectorFourier.integral_bilin_fourierIntegral_eq_flip M (L := (innerₗ V))
160+
continuous_fourierChar continuous_inner f.integrable g.integrable
108161

109162
theorem integral_sesq_fourierIntegral_eq (f : 𝓢(V, E)) (g : 𝓢(V, F)) (M : E →L⋆[ℂ] F →L[ℂ] G) :
110-
∫ ξ, M (𝓕 (f : V → E) ξ) (g ξ) = ∫ x, M (f x) (𝓕⁻ (g : V → F) x) := by
111-
have := VectorFourier.integral_sesq_fourierIntegral_eq_neg_flip M (μ := volume) (ν := volume)
163+
∫ ξ, M (𝓕 f ξ) (g ξ) = ∫ x, M (f x) (𝓕⁻ g x) := by
164+
simpa [fourierInv_coe] using VectorFourier.integral_sesq_fourierIntegral_eq_neg_flip M
112165
(L := (innerₗ V)) continuous_fourierChar continuous_inner f.integrable g.integrable
113-
rwa [flip_innerₗ] at this
114166

115167
/-- Plancherel's theorem for Schwartz functions.
116168
117169
Version where the multiplication is replaced by a general bilinear form `M`. -/
118170
theorem integral_sesq_fourier_fourier (f : 𝓢(V, E)) (g : 𝓢(V, F)) (M : E →L⋆[ℂ] F →L[ℂ] G) :
119-
∫ ξ, M (𝓕 (f : V → E) ξ) (𝓕 (g : V → F) ξ) = ∫ x, M (f x) (g x) := by
120-
simpa only [fourierTransformCLM_apply, fourier_inversion]
121-
using integral_sesq_fourierIntegral_eq f (fourierTransformCLM ℂ g) M
171+
∫ ξ, M (𝓕 f ξ) (𝓕 g ξ) = ∫ x, M (f x) (g x) := by
172+
simpa using integral_sesq_fourierIntegral_eq f (𝓕 g) M
173+
174+
end fubini
175+
176+
section L2
122177

123178
variable {H : Type*} [NormedAddCommGroup H] [InnerProductSpace ℂ H] [CompleteSpace H]
124179

125180
/-- Plancherel's theorem for Schwartz functions. -/
126181
theorem integral_inner_fourier_fourier (f g : 𝓢(V, H)) :
127-
∫ ξ, ⟪𝓕 (f : V → H) ξ, 𝓕 (g : V → H) ξ⟫ = ∫ x, ⟪f x, g x⟫ :=
182+
∫ ξ, ⟪𝓕 f ξ, 𝓕 g ξ⟫ = ∫ x, ⟪f x, g x⟫ :=
128183
integral_sesq_fourier_fourier f g (innerSL ℂ)
129184

130185
theorem integral_norm_sq_fourier (f : 𝓢(V, H)) :
131-
∫ ξ, ‖𝓕 (f : V → H) ξ‖^2 = ∫ x, ‖f x‖^2 := by
186+
∫ ξ, ‖𝓕 f ξ‖^2 = ∫ x, ‖f x‖^2 := by
132187
apply Complex.ofRealLI.injective
133-
simp only [← LinearIsometry.integral_comp_comm]
134-
convert integral_inner_fourier_fourier f f <;>
135-
simp [inner_self_eq_norm_sq_to_K]
188+
simpa [← LinearIsometry.integral_comp_comm, inner_self_eq_norm_sq_to_K] using
189+
integral_inner_fourier_fourier f f
136190

137-
theorem inner_fourierTransformCLM_toL2_eq (f : 𝓢(V, H)) :
138-
⟪(fourierTransformCLM ℂ f).toLp 2, (fourierTransformCLM ℂ f).toLp 2⟫ =
191+
theorem inner_fourier_toL2_eq (f : 𝓢(V, H)) :
192+
⟪(𝓕 f).toLp 2, (𝓕 f).toLp 2⟫ =
139193
⟪f.toLp 2, f.toLp 2⟫ := by
140194
simp only [inner_toL2_toL2_eq]
141195
exact integral_sesq_fourier_fourier f f (innerSL ℂ)
142196

143-
theorem norm_fourierTransformCLM_toL2_eq (f : 𝓢(V, H)) :
144-
‖(fourierTransformCLM ℂ f).toLp 2‖ = ‖f.toLp 2‖ := by
145-
simp_rw [norm_eq_sqrt_re_inner (𝕜 := ℂ), inner_fourierTransformCLM_toL2_eq]
197+
@[deprecated (since := "2025-11-13")]
198+
alias inner_fourierTransformCLM_toL2_eq := inner_fourier_toL2_eq
146199

147-
/-- The Fourier transform on a real inner product space, as a continuous linear equiv on the
148-
Schwartz space. -/
149-
noncomputable def fourierTransformCLE : 𝓢(V, E) ≃L[𝕜] 𝓢(V, E) where
150-
__ := fourierTransformCLM 𝕜
151-
invFun := (compCLMOfContinuousLinearEquiv 𝕜 (LinearIsometryEquiv.neg ℝ (E := V)))
152-
∘L (fourierTransformCLM 𝕜)
153-
left_inv := by
154-
intro f
155-
ext x
156-
change 𝓕 (𝓕 (f : V → E)) (-x) = f x
157-
rw [← fourierIntegralInv_eq_fourierIntegral_neg, Continuous.fourier_inversion f.continuous
158-
f.integrable (fourierTransformCLM 𝕜 f).integrable]
159-
right_inv := by
160-
intro f
161-
ext x
162-
change 𝓕 (fun (x : V) ↦ ((𝓕 (f : V → E)) (-x) : E)) x = f x
163-
simp_rw [← fourierIntegralInv_eq_fourierIntegral_neg, Continuous.fourier_inversion_inv
164-
f.continuous f.integrable (fourierTransformCLM 𝕜 f).integrable]
165-
continuous_invFun := ContinuousLinearMap.continuous _
200+
@[simp] theorem norm_fourier_toL2_eq (f : 𝓢(V, H)) :
201+
‖(𝓕 f).toLp 2‖ = ‖f.toLp 2‖ := by
202+
simp_rw [norm_eq_sqrt_re_inner (𝕜 := ℂ), inner_fourier_toL2_eq]
166203

167-
@[simp] lemma fourierTransformCLE_apply (f : 𝓢(V, E)) :
168-
fourierTransformCLE 𝕜 f = 𝓕 (f : V → E) := rfl
204+
@[deprecated (since := "2025-11-13")]
205+
alias norm_fourierTransformCLM_toL2_eq := norm_fourier_toL2_eq
169206

170-
@[simp] lemma fourierTransformCLE_symm_apply (f : 𝓢(V, E)) :
171-
(fourierTransformCLE 𝕜).symm f = 𝓕⁻ (f : V → E) := by
172-
ext x
173-
exact (fourierIntegralInv_eq_fourierIntegral_neg f x).symm
207+
end L2
174208

175209
end SchwartzMap

Mathlib/Analysis/Fourier/PoissonSummation.lean

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,12 +211,14 @@ end RpowDecay
211211

212212
section Schwartz
213213

214+
open scoped SchwartzMap
215+
214216
/-- **Poisson's summation formula** for Schwartz functions. -/
215-
theorem SchwartzMap.tsum_eq_tsum_fourierIntegral (f : SchwartzMap ℝ ℂ) (x : ℝ) :
216-
∑' n : ℤ, f (x + n) = ∑' n : ℤ, fourierTransformCLM ℝ f n * fourier n (x : UnitAddCircle) := by
217+
theorem SchwartzMap.tsum_eq_tsum_fourierIntegral (f : 𝓢(ℝ, ℂ)) (x : ℝ) :
218+
∑' n : ℤ, f (x + n) = ∑' n : ℤ, 𝓕 f n * fourier n (x : UnitAddCircle) := by
217219
-- We know that Schwartz functions are `O(‖x ^ (-b)‖)` for *every* `b`; for this argument we take
218220
-- `b = 2` and work with that.
219221
apply Real.tsum_eq_tsum_fourierIntegral_of_rpow_decay f.continuous one_lt_two
220-
(f.isBigO_cocompact_rpow (-2)) ((fourierTransformCLM ℝ f).isBigO_cocompact_rpow (-2))
222+
(f.isBigO_cocompact_rpow (-2)) ((𝓕 f).isBigO_cocompact_rpow (-2))
221223

222224
end Schwartz

0 commit comments

Comments
 (0)