Skip to content

Commit f2ecd30

Browse files
committed
chore(Analysis/Fourier): split type class, add continuity one (#33633)
The combined type-class `FourierModule` causes problems when using `fourier_add` since it needs a `Semiring R`, which does not appear in the statement. Therefore, we split `FourierModule` into `FourierAdd` and `FourierSMul` (similar to the case of `LineDeriv`. Moreover, we add the class `ContinuousFourier` which states that the Fourier transform is continuous.
1 parent 7303ce6 commit f2ecd30

File tree

4 files changed

+193
-73
lines changed

4 files changed

+193
-73
lines changed

Mathlib/Analysis/Distribution/FourierSchwartz.lean

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ variable
3737
section definition
3838

3939
/-- The Fourier transform on a real inner product space, as a continuous linear map on the
40-
Schwartz space. -/
40+
Schwartz space.
41+
42+
This definition is only to define the Fourier transform, use `FourierTransform.fourierCLM` instead.
43+
-/
4144
def fourierTransformCLM : 𝓢(V, E) →L[𝕜] 𝓢(V, E) := by
4245
refine mkCLM ((𝓕 : (V → E) → (V → E)) ·) ?_ ?_ ?_ ?_
4346
· intro f g x
@@ -88,12 +91,17 @@ def fourierTransformCLM : 𝓢(V, E) →L[𝕜] 𝓢(V, E) := by
8891
instance instFourierTransform : FourierTransform 𝓢(V, E) 𝓢(V, E) where
8992
fourier f := fourierTransformCLM ℂ f
9093

91-
lemma fourier_coe (f : 𝓢(V, E)) : 𝓕 f = 𝓕 (f : V → E) := rfl
92-
93-
instance instFourierModule : FourierModule 𝕜 𝓢(V, E) 𝓢(V, E) where
94+
instance instFourierAdd : FourierAdd 𝓢(V, E) 𝓢(V, E) where
9495
fourier_add := ContinuousLinearMap.map_add _
96+
97+
instance instFourierSMul : FourierSMul 𝕜 𝓢(V, E) 𝓢(V, E) where
9598
fourier_smul := (fourierTransformCLM 𝕜).map_smul
9699

100+
instance instContinuousFourier : ContinuousFourier 𝓢(V, E) 𝓢(V, E) where
101+
continuous_fourier := ContinuousLinearMap.continuous _
102+
103+
lemma fourier_coe (f : 𝓢(V, E)) : 𝓕 f = 𝓕 (f : V → E) := rfl
104+
97105
@[simp]
98106
theorem fourierTransformCLM_apply (f : 𝓢(V, E)) :
99107
fourierTransformCLM 𝕜 f = 𝓕 f := rfl
@@ -102,16 +110,21 @@ instance instFourierTransformInv : FourierTransformInv 𝓢(V, E) 𝓢(V, E) whe
102110
fourierInv := (compCLMOfContinuousLinearEquiv ℂ (LinearIsometryEquiv.neg ℝ (E := V)))
103111
∘L (fourierTransformCLM ℂ)
104112

113+
instance instFourierInvAdd : FourierInvAdd 𝓢(V, E) 𝓢(V, E) where
114+
fourierInv_add := ContinuousLinearMap.map_add _
115+
116+
instance instFourierInvSMul : FourierInvSMul 𝕜 𝓢(V, E) 𝓢(V, E) where
117+
fourierInv_smul := ((compCLMOfContinuousLinearEquiv 𝕜 (D := V) (E := V) (F := E)
118+
(LinearIsometryEquiv.neg ℝ (E := V))) ∘L (fourierTransformCLM 𝕜)).map_smul
119+
120+
instance instContinuousFourierInv : ContinuousFourierInv 𝓢(V, E) 𝓢(V, E) where
121+
continuous_fourierInv := ContinuousLinearMap.continuous _
122+
105123
lemma fourierInv_coe (f : 𝓢(V, E)) :
106124
𝓕⁻ f = 𝓕⁻ (f : V → E) := by
107125
ext x
108126
exact (fourierInv_eq_fourier_neg f x).symm
109127

110-
instance instFourierInvModule : FourierInvModule 𝕜 𝓢(V, E) 𝓢(V, E) where
111-
fourierInv_add := ContinuousLinearMap.map_add _
112-
fourierInv_smul := ((compCLMOfContinuousLinearEquiv 𝕜 (D := V) (E := V) (F := E)
113-
(LinearIsometryEquiv.neg ℝ (E := V))) ∘L (fourierTransformCLM 𝕜)).map_smul
114-
115128
variable [CompleteSpace E]
116129

117130
instance instFourierPair : FourierPair 𝓢(V, E) 𝓢(V, E) where
@@ -134,18 +147,14 @@ alias fourier_inversion := FourierTransform.fourierInv_fourier_eq
134147
@[deprecated (since := "2025-11-13")]
135148
alias fourier_inversion_inv := FourierTransform.fourier_fourierInv_eq
136149

137-
/-- The Fourier transform on a real inner product space, as a continuous linear equiv on the
138-
Schwartz space. -/
139-
def fourierTransformCLE : 𝓢(V, E) ≃L[𝕜] 𝓢(V, E) where
140-
__ := FourierTransform.fourierEquiv 𝕜 𝓢(V, E) 𝓢(V, E)
141-
continuous_toFun := (fourierTransformCLM 𝕜).continuous
142-
continuous_invFun := ContinuousLinearMap.continuous _
150+
@[deprecated (since := "2026-01-06")]
151+
alias fourierTransformCLE := FourierTransform.fourierCLE
143152

144-
@[simp]
145-
lemma fourierTransformCLE_apply (f : 𝓢(V, E)) : fourierTransformCLE 𝕜 f = 𝓕 f := rfl
153+
@[deprecated (since := "2026-01-06")]
154+
alias fourierTransformCLE_apply := FourierTransform.fourierCLE_apply
146155

147-
@[simp]
148-
lemma fourierTransformCLE_symm_apply (f : 𝓢(V, E)) : (fourierTransformCLE 𝕜).symm f = 𝓕⁻ f := rfl
156+
@[deprecated (since := "2026-01-06")]
157+
alias fourierTransformCLE_symm_apply := FourierTransform.fourierCLE_symm_apply
149158

150159
end definition
151160

Mathlib/Analysis/Distribution/TemperedDistribution.lean

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -333,35 +333,53 @@ variable [NormedAddCommGroup E] [NormedAddCommGroup F]
333333
[InnerProductSpace ℝ E] [NormedSpace ℂ F]
334334
[FiniteDimensional ℝ E] [MeasurableSpace E] [BorelSpace E]
335335

336-
variable (E F) in
337-
/-- The Fourier transform on tempered distributions as a continuous linear map. -/
338-
def fourierTransformCLM : 𝓢'(E, F) →L[ℂ] 𝓢'(E, F) :=
339-
PointwiseConvergenceCLM.precomp F (SchwartzMap.fourierTransformCLM ℂ)
340-
341336
instance instFourierTransform : FourierTransform 𝓢'(E, F) 𝓢'(E, F) where
342-
fourier := fourierTransformCLM E F
337+
fourier := PointwiseConvergenceCLM.precomp F (fourierCLM ℂ 𝓢(E, ℂ))
343338

344-
@[simp]
345-
theorem fourierTransformCLM_apply (f : 𝓢'(E, F)) :
346-
fourierTransformCLM E F f = 𝓕 f := rfl
339+
instance instFourierAdd : FourierAdd 𝓢'(E, F) 𝓢'(E, F) where
340+
fourier_add := (PointwiseConvergenceCLM.precomp F (fourierCLM ℂ 𝓢(E, ℂ))).map_add
341+
342+
instance instFourierSMul : FourierSMul ℂ 𝓢'(E, F) 𝓢'(E, F) where
343+
fourier_smul := (PointwiseConvergenceCLM.precomp F (fourierCLM ℂ 𝓢(E, ℂ))).map_smul
344+
345+
instance instContinuousFourier : ContinuousFourier 𝓢'(E, F) 𝓢'(E, F) where
346+
continuous_fourier := (PointwiseConvergenceCLM.precomp F (fourierCLM ℂ 𝓢(E, ℂ))).cont
347347

348348
@[simp]
349-
theorem fourierTransform_apply (f : 𝓢'(E, F)) (g : 𝓢(E, ℂ)) : 𝓕 f g = f (𝓕 g) := rfl
349+
theorem fourier_apply (f : 𝓢'(E, F)) (g : 𝓢(E, ℂ)) : 𝓕 f g = f (𝓕 g) := rfl
350350

351-
variable (E F) in
352-
/-- The inverse Fourier transform on tempered distributions as a continuous linear map. -/
353-
def fourierTransformInvCLM : 𝓢'(E, F) →L[ℂ] 𝓢'(E, F) :=
354-
PointwiseConvergenceCLM.precomp F (SchwartzMap.fourierTransformCLE ℂ).symm.toContinuousLinearMap
351+
@[deprecated (since := "2026-01-06")]
352+
alias fourierTransformCLM := FourierTransform.fourierCLM
353+
354+
@[deprecated (since := "2026-01-06")]
355+
alias fourierTransformCLM_apply := FourierTransform.fourierCLM_apply
356+
357+
@[deprecated (since := "2026-01-06")]
358+
alias fourierTransform_apply := fourier_apply
355359

356360
instance instFourierTransformInv : FourierTransformInv 𝓢'(E, F) 𝓢'(E, F) where
357-
fourierInv := fourierTransformInvCLM E F
361+
fourierInv := PointwiseConvergenceCLM.precomp F (fourierInvCLM ℂ 𝓢(E, ℂ))
358362

359-
@[simp]
360-
theorem fourierTransformInvCLM_apply (f : 𝓢'(E, F)) :
361-
fourierTransformInvCLM E F f = 𝓕⁻ f := rfl
363+
instance instFourierInvAdd : FourierInvAdd 𝓢'(E, F) 𝓢'(E, F) where
364+
fourierInv_add := (PointwiseConvergenceCLM.precomp F (fourierInvCLM ℂ 𝓢(E, ℂ))).map_add
365+
366+
instance instFourierInvSMul : FourierInvSMul ℂ 𝓢'(E, F) 𝓢'(E, F) where
367+
fourierInv_smul := (PointwiseConvergenceCLM.precomp F (fourierInvCLM ℂ 𝓢(E, ℂ))).map_smul
368+
369+
instance instContinuousFourierInv : ContinuousFourierInv 𝓢'(E, F) 𝓢'(E, F) where
370+
continuous_fourierInv := (PointwiseConvergenceCLM.precomp F (fourierInvCLM ℂ 𝓢(E, ℂ))).cont
362371

363372
@[simp]
364-
theorem fourierTransformInv_apply (f : 𝓢'(E, F)) (g : 𝓢(E, ℂ)) : 𝓕⁻ f g = f (𝓕⁻ g) := rfl
373+
theorem fourierInv_apply (f : 𝓢'(E, F)) (g : 𝓢(E, ℂ)) : 𝓕⁻ f g = f (𝓕⁻ g) := rfl
374+
375+
@[deprecated (since := "2026-01-06")]
376+
alias fourierTransformInvCLM := FourierTransform.fourierInvCLM
377+
378+
@[deprecated (since := "2026-01-06")]
379+
alias fourierTransformInvCLM_apply := FourierTransform.fourierInvCLM_apply
380+
381+
@[deprecated (since := "2026-01-06")]
382+
alias fourierTransformInv_apply := fourierInv_apply
365383

366384
instance instFourierPair : FourierPair 𝓢'(E, F) 𝓢'(E, F) where
367385
fourierInv_fourier_eq f := by ext; simp
@@ -373,19 +391,19 @@ variable [CompleteSpace F]
373391

374392
/-- The distributional Fourier transform and the classical Fourier transform coincide on
375393
`𝓢(E, F)`. -/
376-
theorem fourierTransform_toTemperedDistributionCLM_eq (f : 𝓢(E, F)) :
394+
theorem fourier_toTemperedDistributionCLM_eq (f : 𝓢(E, F)) :
377395
𝓕 (f : 𝓢'(E, F)) = 𝓕 f := by
378396
ext g
379397
simpa using integral_fourier_smul_eq g f
380398

381399
/-- The distributional inverse Fourier transform and the classical inverse Fourier transform
382400
coincide on `𝓢(E, F)`. -/
383-
theorem fourierTransformInv_toTemperedDistributionCLM_eq (f : 𝓢(E, F)) :
401+
theorem fourierInv_toTemperedDistributionCLM_eq (f : 𝓢(E, F)) :
384402
𝓕⁻ (f : 𝓢'(E, F)) = 𝓕⁻ f := calc
385403
_ = 𝓕⁻ (toTemperedDistributionCLM E F volume (𝓕 (𝓕⁻ f))) := by
386404
congr; exact (fourier_fourierInv_eq f).symm
387405
_ = 𝓕⁻ (𝓕 (toTemperedDistributionCLM E F volume (𝓕⁻ f))) := by
388-
rw [fourierTransform_toTemperedDistributionCLM_eq]
406+
rw [fourier_toTemperedDistributionCLM_eq]
389407
_ = _ := fourierInv_fourier_eq _
390408

391409
end Fourier

Mathlib/Analysis/Fourier/LpSpace.lean

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ In this file we define the Fourier transform on $L^2$ as a linear isometry equiv
1616
1717
## Main definitions
1818
19-
* `Lp.fourierTransformₗᵢ`: The Fourier transform on $L^2$ as a linear isometry equivalence.
19+
* `MeasureTheory.Lp.fourierTransformₗᵢ`: The Fourier transform on $L^2$ as a linear isometry
20+
equivalence.
2021
2122
## Main statements
2223
@@ -46,7 +47,7 @@ namespace MeasureTheory.Lp
4647
variable (E F) in
4748
/-- The Fourier transform on `L2` as a linear isometry equivalence. -/
4849
def fourierTransformₗᵢ : (Lp (α := E) F 2) ≃ₗᵢ[ℂ] (Lp (α := E) F 2) :=
49-
(fourierTransformCLE(V := E) (E := F)).toLinearEquiv.extendOfIsometry
50+
(fourierEquiv𝓢(E, F)).extendOfIsometry
5051
(toLpCLM ℂ (E := E) F 2 volume) (toLpCLM ℂ (E := E) F 2 volume)
5152
-- Not explicitly stating the measure as being the volume causes time-outs in the proofs below
5253
(denseRange_toLpCLM ENNReal.ofNat_ne_top) (denseRange_toLpCLM ENNReal.ofNat_ne_top)
@@ -55,9 +56,27 @@ def fourierTransformₗᵢ : (Lp (α := E) F 2) ≃ₗᵢ[ℂ] (Lp (α := E) F 2
5556
instance instFourierTransform : FourierTransform (Lp (α := E) F 2) (Lp (α := E) F 2) where
5657
fourier := fourierTransformₗᵢ E F
5758

59+
instance instFourierAdd : FourierAdd (Lp (α := E) F 2) (Lp (α := E) F 2) where
60+
fourier_add := (fourierTransformₗᵢ E F).map_add
61+
62+
instance instFourierSMul : FourierSMul ℂ (Lp (α := E) F 2) (Lp (α := E) F 2) where
63+
fourier_smul := (fourierTransformₗᵢ E F).map_smul
64+
65+
instance instContinuousFourier : ContinuousFourier (Lp (α := E) F 2) (Lp (α := E) F 2) where
66+
continuous_fourier := (fourierTransformₗᵢ E F).continuous
67+
5868
instance instFourierTransformInv : FourierTransformInv (Lp (α := E) F 2) (Lp (α := E) F 2) where
5969
fourierInv := (fourierTransformₗᵢ E F).symm
6070

71+
instance instFourierInvAdd : FourierInvAdd (Lp (α := E) F 2) (Lp (α := E) F 2) where
72+
fourierInv_add := (fourierTransformₗᵢ E F).symm.map_add
73+
74+
instance instFourierInvSMul : FourierInvSMul ℂ (Lp (α := E) F 2) (Lp (α := E) F 2) where
75+
fourierInv_smul := (fourierTransformₗᵢ E F).symm.map_smul
76+
77+
instance instContinuousFourierInv : ContinuousFourierInv (Lp (α := E) F 2) (Lp (α := E) F 2) where
78+
continuous_fourierInv := (fourierTransformₗᵢ E F).symm.continuous
79+
6180
instance instFourierPair : FourierPair (Lp (α := E) F 2) (Lp (α := E) F 2) where
6281
fourierInv_fourier_eq := (Lp.fourierTransformₗᵢ E F).symm_apply_apply
6382

@@ -103,11 +122,10 @@ theorem fourier_toTemperedDistribution_eq (f : Lp (α := E) F 2) :
103122
apply DenseRange.induction_on (p := p)
104123
(SchwartzMap.denseRange_toLpCLM (p := 2) ENNReal.ofNat_ne_top) f
105124
· apply isClosed_eq
106-
· exact ((TemperedDistribution.fourierTransformCLM E F) ∘L
107-
(toTemperedDistributionCLM F volume 2)).cont
108-
· exact (toTemperedDistributionCLM F volume 2).cont.comp (fourierTransformₗᵢ E F).continuous
125+
· exact (fourierCLM ℂ 𝓢'(E, F) ∘L toTemperedDistributionCLM F volume 2).continuous
126+
· exact (toTemperedDistributionCLM F volume 2 ∘L fourierCLM ℂ (Lp (α := E) F 2)).continuous
109127
intro f
110-
simp [p, TemperedDistribution.fourierTransform_toTemperedDistributionCLM_eq]
128+
simp [p, TemperedDistribution.fourier_toTemperedDistributionCLM_eq]
111129

112130
/-- The `𝓢'`-inverse Fourier transform and the `L2`-inverse Fourier transform coincide on `L2`. -/
113131
theorem fourierInv_toTemperedDistribution_eq (f : Lp (α := E) F 2) :

0 commit comments

Comments
 (0)