|
import Mathlib.Analysis.Distribution.FourierSchwartz |
|
import Mathlib.MeasureTheory.Function.L2Space |
|
import Mathlib.MeasureTheory.Integral.Bochner.ContinuousLinearMap |
|
import Mathlib.Analysis.Normed.Operator.Completeness |
|
import Mathlib.Topology.Continuous |
|
import MIL_copy.slides.quantum_mechanics_fourier_l2pmap2 |
|
|
|
/-! |
|
# quantum_mechanics_plancherel_standalone |
|
|
|
Schwartz 関数に対する Parseval(積分形)と、それを用いた $L^2$ ノルム保存(Plancherel)を、 |
|
Mathlib の `Real.fourierIntegral`(`2π` 正規化)に基づいてまとめた単一ファイル。 |
|
|
|
量子力学の「位置表示 ↔ 運動量表示」の橋渡しで必要となる |
|
- `conj` と逆フーリエの関係 |
|
- Schwartz 上の Parseval(積分形) |
|
- Schwartz → `Lp 2`(= $L^2$)への接続 |
|
|
|
をここで完結に提供する。 |
|
-/ |
|
|
|
namespace QuantumMechanicsStandalone |
|
|
|
open scoped FourierTransform |
|
open scoped ComplexConjugate |
|
open scoped RealInnerProductSpace |
|
open scoped ENNReal |
|
|
|
open MeasureTheory |
|
|
|
local notation "π" => Real.pi |
|
|
|
/-- `ℝ^d`(実内積空間)を `EuclideanSpace ℝ (Fin d)` として表す。 -/ |
|
abbrev Rd (d : ℕ) : Type := EuclideanSpace ℝ (Fin d) |
|
|
|
/-- `ℝ^d` 上の複素値 Schwartz 関数。 -/ |
|
abbrev SchwartzRd (d : ℕ) : Type := SchwartzMap (Rd d) ℂ |
|
|
|
/-- `ℝ^d` 上の $L^2$(Mathlib の `Lp` による表現)。 -/ |
|
abbrev L2Rd (d : ℕ) : Type := MeasureTheory.Lp ℂ 2 (volume : Measure (Rd d)) |
|
|
|
namespace PlancherelTools |
|
|
|
variable {V : Type*} [NormedAddCommGroup V] [InnerProductSpace ℝ V] [FiniteDimensional ℝ V] |
|
[MeasurableSpace V] [BorelSpace V] |
|
|
|
/-- 共役は逆フーリエ(共役した関数)に一致する。 |
|
|
|
ここでの `𝓕` / `𝓕⁻` は Mathlib の `Real.fourierIntegral` / `Real.fourierIntegralInv`。 |
|
-/ |
|
theorem conj_fourierIntegral_eq_fourierIntegralInv_conj (f : V → ℂ) (w : V) : |
|
conj (𝓕 f w) = 𝓕⁻ (fun v : V => conj (f v)) w := by |
|
-- 指数を一貫した形 `-(2 * (π:ℂ) * (⟪v,w⟫_ℝ:ℂ) * I)` に揃えて計算する |
|
-- (import 追加により `⟪·,·⟫` が曖昧になり得るので、`𝕜 := ℝ` を明示して回避) |
|
let zneg : V → ℂ := fun v => |
|
-(2 * (π : ℂ) * ((inner (𝕜 := ℝ) v w : ℝ) : ℂ) * Complex.I) |
|
let zpos : V → ℂ := fun v => |
|
(2 * (π : ℂ) * ((inner (𝕜 := ℝ) v w : ℝ) : ℂ) * Complex.I) |
|
|
|
have hF : (𝓕 f w) = ∫ v : V, Complex.exp (zneg v) • f v := by |
|
simp [Real.fourierIntegral_eq', zneg, mul_left_comm, mul_comm] |
|
|
|
have hFinv : |
|
(𝓕⁻ (fun v : V => conj (f v)) w) |
|
= ∫ v : V, Complex.exp (zpos v) • conj (f v) := by |
|
simp [Real.fourierIntegralInv_eq', zpos, mul_left_comm, mul_comm] |
|
|
|
have hconj : |
|
conj (∫ v : V, Complex.exp (zneg v) • f v) |
|
= ∫ v : V, conj (Complex.exp (zneg v) • f v) := by |
|
simpa using |
|
(integral_conj (μ := (MeasureTheory.volume : MeasureTheory.Measure V)) |
|
(f := fun v : V => (Complex.exp (zneg v) • f v))).symm |
|
|
|
have hkernel : |
|
(fun v : V => conj (Complex.exp (zneg v) • f v)) |
|
= fun v : V => Complex.exp (zpos v) • conj (f v) := by |
|
funext v |
|
have hz : conj (zneg v) = zpos v := by |
|
dsimp [zneg, zpos] |
|
have h2 : conj (2 : ℂ) = (2 : ℂ) := by |
|
simpa using (Complex.conj_ofNat (n := 2)) |
|
have hpi : conj (π : ℂ) = (π : ℂ) := by |
|
simpa using (Complex.conj_ofReal π) |
|
have hin : conj (((inner (𝕜 := ℝ) v w : ℝ) : ℂ)) = ((inner (𝕜 := ℝ) v w : ℝ) : ℂ) := by |
|
simpa using (Complex.conj_ofReal (inner (𝕜 := ℝ) v w)) |
|
have hI : conj (Complex.I : ℂ) = -(Complex.I : ℂ) := by |
|
simpa using (Complex.conj_I) |
|
have hA : |
|
conj (2 * (π : ℂ) * ((inner (𝕜 := ℝ) v w : ℝ) : ℂ)) |
|
= (2 * (π : ℂ) * ((inner (𝕜 := ℝ) v w : ℝ) : ℂ)) := by |
|
calc |
|
conj (2 * (π : ℂ) * ((inner (𝕜 := ℝ) v w : ℝ) : ℂ)) |
|
= conj (2 * (π : ℂ)) * conj ((inner (𝕜 := ℝ) v w : ℝ) : ℂ) := by |
|
simpa [mul_assoc] using |
|
(map_mul (starRingEnd ℂ) (2 * (π : ℂ)) ((inner (𝕜 := ℝ) v w : ℝ) : ℂ)) |
|
_ = (conj (2 : ℂ) * conj (π : ℂ)) * conj ((inner (𝕜 := ℝ) v w : ℝ) : ℂ) := by |
|
simpa [mul_assoc] using |
|
congrArg (fun t => t * conj ((inner (𝕜 := ℝ) v w : ℝ) : ℂ)) |
|
(map_mul (starRingEnd ℂ) (2 : ℂ) (π : ℂ)) |
|
_ = (2 : ℂ) * (π : ℂ) * ((inner (𝕜 := ℝ) v w : ℝ) : ℂ) := by |
|
simp [h2, hpi, hin, mul_assoc] |
|
calc |
|
conj (-(2 * (π : ℂ) * ((inner (𝕜 := ℝ) v w : ℝ) : ℂ) * Complex.I)) |
|
= -conj (2 * (π : ℂ) * ((inner (𝕜 := ℝ) v w : ℝ) : ℂ) * Complex.I) := by simp |
|
_ = -(conj (2 * (π : ℂ) * ((inner (𝕜 := ℝ) v w : ℝ) : ℂ)) * conj (Complex.I)) := by |
|
simpa [mul_assoc] using congrArg (fun t => -t) |
|
(map_mul (starRingEnd ℂ) |
|
(2 * (π : ℂ) * ((inner (𝕜 := ℝ) v w : ℝ) : ℂ)) (Complex.I : ℂ)) |
|
_ = -((2 * (π : ℂ) * ((inner (𝕜 := ℝ) v w : ℝ) : ℂ)) * (-Complex.I)) := by |
|
simp [hA, hI] |
|
_ = (2 * (π : ℂ) * ((inner (𝕜 := ℝ) v w : ℝ) : ℂ) * Complex.I) := by |
|
simp [mul_assoc] |
|
calc |
|
conj (Complex.exp (zneg v) • f v) |
|
= conj (Complex.exp (zneg v) * f v) := by |
|
simp [smul_eq_mul] |
|
_ = conj (Complex.exp (zneg v)) * conj (f v) := by |
|
simp |
|
_ = Complex.exp (conj (zneg v)) * conj (f v) := by |
|
simpa using congrArg (fun t => t * conj (f v)) |
|
(by simpa using (Complex.exp_conj (x := zneg v)).symm) |
|
_ = Complex.exp (zpos v) * conj (f v) := by |
|
simp [hz] |
|
_ = Complex.exp (zpos v) • conj (f v) := by |
|
simp [smul_eq_mul] |
|
|
|
calc |
|
conj (𝓕 f w) |
|
= conj (∫ v : V, Complex.exp (zneg v) • f v) := by |
|
simp [hF] |
|
_ = ∫ v : V, conj (Complex.exp (zneg v) • f v) := by |
|
simpa using hconj |
|
_ = ∫ v : V, Complex.exp (zpos v) • conj (f v) := by |
|
simpa using congrArg (fun g => (∫ v : V, g v)) hkernel |
|
_ = 𝓕⁻ (fun v : V => conj (f v)) w := by |
|
simp [hFinv] |
|
|
|
end PlancherelTools |
|
|
|
namespace FourierParsevalSchwartz |
|
|
|
variable {d : ℕ} |
|
|
|
/-- Schwartz 関数に対する Parseval(積分形)。 -/ |
|
theorem parseval_integral (d : ℕ) (ψ : SchwartzRd d) : |
|
(∫ x : Rd d, conj (𝓕 (fun y : Rd d => ψ y) x) * (𝓕 (fun y : Rd d => ψ y) x)) |
|
= |
|
(∫ x : Rd d, conj (ψ x) * (ψ x)) := by |
|
classical |
|
|
|
let μ : Measure (Rd d) := (volume : Measure (Rd d)) |
|
haveI : μ.HasTemperateGrowth := by infer_instance |
|
|
|
-- 本体関数と補助関数 |
|
let f : Rd d → ℂ := fun x => ψ x |
|
let g : Rd d → ℂ := fun x => conj (𝓕 f x) |
|
|
|
have hf : Integrable f μ := by |
|
simpa [f] using (ψ.integrable (μ := μ)) |
|
|
|
have hFf : Integrable (𝓕 f) μ := by |
|
let Fψ : SchwartzMap (Rd d) ℂ := |
|
(SchwartzMap.fourierTransformCLM (𝕜 := ℂ) (V := Rd d) (E := ℂ)) ψ |
|
have : Integrable (fun x : Rd d => Fψ x) μ := by |
|
simpa using (Fψ.integrable (μ := μ)) |
|
simpa [Fψ, SchwartzMap.fourierTransformCLM_apply, f] using this |
|
|
|
have hg : Integrable g μ := by |
|
let L : ℂ →L[ℝ] ℂ := Complex.conjCLE.toContinuousLinearMap |
|
simpa [g, L] using (ContinuousLinearMap.integrable_comp (μ := μ) L hFf) |
|
|
|
-- `𝓕 g = conj f` |
|
have hFg : (𝓕 g) = fun x : Rd d => conj (f x) := by |
|
have hg_eq : g = fun x : Rd d => 𝓕⁻ (fun y : Rd d => conj (f y)) x := by |
|
funext x |
|
simpa [g] using |
|
(PlancherelTools.conj_fourierIntegral_eq_fourierIntegralInv_conj |
|
(f := f) (w := x)) |
|
|
|
have hconjf_cont : Continuous (fun x : Rd d => conj (f x)) := by |
|
simpa [f] using (Complex.continuous_conj.comp (ψ.continuous)) |
|
|
|
have hconjf_int : Integrable (fun x : Rd d => conj (f x)) μ := by |
|
let L : ℂ →L[ℝ] ℂ := Complex.conjCLE.toContinuousLinearMap |
|
simpa [f, L] using (ContinuousLinearMap.integrable_comp (μ := μ) L hf) |
|
|
|
have hFconjf_int : Integrable (𝓕 (fun x : Rd d => conj (f x))) μ := by |
|
let finvSch : SchwartzMap (Rd d) ℂ := |
|
(SchwartzMap.fourierTransformCLE (𝕜 := ℂ) (V := Rd d) (E := ℂ)).symm ψ |
|
have hfinv_int : Integrable (fun x : Rd d => finvSch x) μ := by |
|
simpa using (finvSch.integrable (μ := μ)) |
|
have hfinv_eq : (fun x : Rd d => finvSch x) = fun x : Rd d => 𝓕⁻ f x := by |
|
funext x |
|
simp [finvSch, SchwartzMap.fourierTransformCLE_symm_apply, f] |
|
|
|
have hpoint : (𝓕 (fun y : Rd d => conj (f y))) |
|
= fun x : Rd d => conj (𝓕⁻ f x) := by |
|
funext x |
|
have hconj : |
|
conj (𝓕 (fun y : Rd d => conj (f y)) x) |
|
= 𝓕⁻ (fun y : Rd d => conj (conj (f y))) x := by |
|
simpa using |
|
(PlancherelTools.conj_fourierIntegral_eq_fourierIntegralInv_conj |
|
(f := fun y : Rd d => conj (f y)) (w := x)) |
|
have := congrArg conj (by simpa [f] using hconj) |
|
simpa using this |
|
|
|
let L : ℂ →L[ℝ] ℂ := Complex.conjCLE.toContinuousLinearMap |
|
have hLfinv_int : Integrable (fun x : Rd d => L (finvSch x)) μ := |
|
ContinuousLinearMap.integrable_comp (μ := μ) L hfinv_int |
|
|
|
have hconj_pt : ∀ x : Rd d, L (finvSch x) = conj (𝓕⁻ f x) := by |
|
intro x |
|
calc |
|
L (finvSch x) = conj (finvSch x) := by simp [L] |
|
_ = conj (𝓕⁻ f x) := by |
|
simpa using congrArg conj (by simpa using congrArg (fun h => h x) hfinv_eq) |
|
|
|
have hL_ae : |
|
(fun x : Rd d => L (finvSch x)) =ᶠ[ae μ] fun x : Rd d => conj (𝓕⁻ f x) := by |
|
filter_upwards [ae_of_all μ hconj_pt] with x hx |
|
simpa using hx |
|
|
|
have : Integrable (fun x : Rd d => conj (𝓕⁻ f x)) μ := |
|
(MeasureTheory.integrable_congr (μ := μ) (f := fun x : Rd d => L (finvSch x)) |
|
(g := fun x : Rd d => conj (𝓕⁻ f x)) hL_ae).1 hLfinv_int |
|
|
|
-- `hpoint` は `𝓕 (conj f) = conj (𝓕⁻ f)` の「等式(関数として)」なので、 |
|
-- `Integrable` の目標を a.e. 同値で運ぶ(`simp` だと `conj`/`star` の揺れで壊れやすい)。 |
|
have hpoint_ae : |
|
(fun x : Rd d => conj (𝓕⁻ f x)) =ᵐ[μ] (𝓕 fun y : Rd d => conj (f y)) := by |
|
refine (ae_of_all _ ?_) |
|
intro x |
|
simpa using (congrArg (fun g => g x) hpoint).symm |
|
exact (MeasureTheory.integrable_congr (μ := μ) |
|
(f := fun x : Rd d => conj (𝓕⁻ f x)) |
|
(g := (𝓕 fun y : Rd d => conj (f y))) hpoint_ae).1 this |
|
|
|
have hinv : 𝓕 (fun x : Rd d => 𝓕⁻ (fun y : Rd d => conj (f y)) x) |
|
= (fun x : Rd d => conj (f x)) := by |
|
simpa using |
|
(Continuous.fourier_inversion_inv (V := Rd d) (E := ℂ) |
|
(f := fun x : Rd d => conj (f x)) hconjf_cont hconjf_int hFconjf_int) |
|
|
|
simpa [hg_eq] using hinv |
|
|
|
have hflip : |
|
(∫ x : Rd d, (𝓕 f x) • g x ∂μ) = ∫ x : Rd d, f x • (𝓕 g x) ∂μ := by |
|
have hLflip : (innerₗ (Rd d)).flip = innerₗ (Rd d) := by |
|
ext v w |
|
simp |
|
simpa [Real.fourierIntegral, VectorFourier.fourierIntegral, hLflip] using |
|
(VectorFourier.integral_fourierIntegral_smul_eq_flip (L := innerₗ (Rd d)) |
|
Real.continuous_fourierChar continuous_inner hf hg) |
|
|
|
have hflip' : |
|
(∫ x : Rd d, (𝓕 f x) * conj (𝓕 f x) ∂μ) = ∫ x : Rd d, f x * conj (f x) ∂μ := by |
|
have hflip_mul : |
|
(∫ x : Rd d, (𝓕 f x) * g x ∂μ) = ∫ x : Rd d, f x * (𝓕 g x) ∂μ := by |
|
simpa [smul_eq_mul] using hflip |
|
have hFg_pt : ∀ x : Rd d, 𝓕 g x = conj (f x) := by |
|
intro x |
|
simpa using congrArg (fun h => h x) hFg |
|
have hflip_mul2 : (∫ x : Rd d, (𝓕 f x) * g x ∂μ) = ∫ x : Rd d, f x * conj (f x) ∂μ := by |
|
have hRint : |
|
(∫ x : Rd d, f x * (𝓕 g x) ∂μ) = ∫ x : Rd d, f x * conj (f x) ∂μ := by |
|
refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) |
|
intro x |
|
simp [hFg_pt x] |
|
exact hflip_mul.trans hRint |
|
simpa [g] using hflip_mul2 |
|
|
|
calc |
|
(∫ x : Rd d, conj (𝓕 f x) * (𝓕 f x) ∂μ) |
|
= ∫ x : Rd d, (𝓕 f x) * conj (𝓕 f x) ∂μ := by |
|
refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) |
|
intro x |
|
simp [mul_comm] |
|
_ = ∫ x : Rd d, f x * conj (f x) ∂μ := hflip' |
|
_ = ∫ x : Rd d, conj (f x) * (f x) ∂μ := by |
|
refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) |
|
intro x |
|
simp [mul_comm] |
|
_ = (∫ x : Rd d, conj (ψ x) * (ψ x) ∂μ) := by |
|
simp [f] |
|
|
|
end FourierParsevalSchwartz |
|
|
|
namespace FourierL2 |
|
|
|
/-- Schwartz を $L^2$(`Lp 2`)へ送る線形写像。 -/ |
|
noncomputable def schwartzToL2LM (d : ℕ) : SchwartzRd d →ₗ[ℂ] L2Rd d := by |
|
classical |
|
haveI : Fact ((1 : ℝ≥0∞) ≤ (2 : ℝ≥0∞)) := by infer_instance |
|
haveI : (volume : Measure (Rd d)).HasTemperateGrowth := by infer_instance |
|
exact (SchwartzMap.toLpCLM ℂ ℂ (2 : ℝ≥0∞) (volume : Measure (Rd d))).toLinearMap |
|
|
|
/-- Schwartz 上のフーリエ変換(Schwartz→Schwartz)。 -/ |
|
noncomputable def fourierSchwartzLM (d : ℕ) : SchwartzRd d →ₗ[ℂ] SchwartzRd d := by |
|
classical |
|
exact (SchwartzMap.fourierTransformCLM (𝕜 := ℂ) (V := Rd d) (E := ℂ)).toLinearMap |
|
|
|
/-- Schwartz を $L^2$ に落としてからフーリエしたもの。 -/ |
|
noncomputable def fourierToL2LM (d : ℕ) : SchwartzRd d →ₗ[ℂ] L2Rd d := |
|
(schwartzToL2LM (d := d)).comp (fourierSchwartzLM (d := d)) |
|
|
|
set_option maxHeartbeats 400000 |
|
|
|
/-- Schwartz 関数の `L²` ノルムはフーリエ変換で保存される(Plancherel)。 |
|
|
|
本ファイル内の `FourierParsevalSchwartz.parseval_integral` を |
|
`Lp E 2 μ` の内積定義(`MeasureTheory.L2.inner_def`)に接続して示す。 |
|
-/ |
|
theorem plancherel_schwartz_toL2 (d : ℕ) (ψ : SchwartzRd d) : |
|
‖fourierToL2LM (d := d) ψ‖ = ‖schwartzToL2LM (d := d) ψ‖ := by |
|
classical |
|
haveI : Fact ((1 : ℝ≥0∞) ≤ (2 : ℝ≥0∞)) := by infer_instance |
|
haveI : (volume : Measure (Rd d)).HasTemperateGrowth := by infer_instance |
|
|
|
let X : L2Rd d := (schwartzToL2LM (d := d)) ψ |
|
let Y : L2Rd d := (fourierToL2LM (d := d)) ψ |
|
-- 以降は `X`,`Y` のノルム等式として示す |
|
change ‖Y‖ = ‖X‖ |
|
|
|
have hX_toLp : X = (ψ.toLp (2 : ℝ≥0∞) (volume : Measure (Rd d))) := by |
|
dsimp [X, schwartzToL2LM] |
|
exact (SchwartzMap.toLpCLM_apply (𝕜 := ℂ) (F := ℂ) (p := (2 : ℝ≥0∞)) |
|
(μ := (volume : Measure (Rd d))) (f := ψ)) |
|
|
|
have hY_toLp : |
|
Y = (((fourierSchwartzLM (d := d)) ψ).toLp (2 : ℝ≥0∞) (volume : Measure (Rd d))) := by |
|
-- `fourierToL2LM = schwartzToL2LM ∘ fourierSchwartzLM` |
|
dsimp [Y, fourierToL2LM, LinearMap.comp_apply] |
|
-- `schwartzToL2LM_apply` |
|
dsimp [schwartzToL2LM] |
|
exact (SchwartzMap.toLpCLM_apply (𝕜 := ℂ) (F := ℂ) (p := (2 : ℝ≥0∞)) |
|
(μ := (volume : Measure (Rd d))) (f := ((fourierSchwartzLM (d := d)) ψ))) |
|
|
|
have hX_ae : |
|
(fun x : Rd d => (X x)) =ᵐ[(volume : Measure (Rd d))] fun x : Rd d => ψ x := by |
|
simpa [hX_toLp] using |
|
(SchwartzMap.coeFn_toLp (f := ψ) (p := (2 : ℝ≥0∞)) (μ := (volume : Measure (Rd d)))) |
|
|
|
have hF : (fun x : Rd d => ((fourierSchwartzLM (d := d)) ψ) x) |
|
= fun x : Rd d => (𝓕 (fun y : Rd d => ψ y) x) := by |
|
funext x |
|
change |
|
((SchwartzMap.fourierTransformCLM (𝕜 := ℂ) (V := Rd d) (E := ℂ)) ψ) x |
|
= (𝓕 (fun y : Rd d => ψ y) x) |
|
simp [SchwartzMap.fourierTransformCLM_apply] |
|
|
|
have hY_ae : |
|
(fun x : Rd d => (Y x)) =ᵐ[(volume : Measure (Rd d))] |
|
fun x : Rd d => (𝓕 (fun y : Rd d => ψ y) x) := by |
|
have h1 : |
|
(fun x : Rd d => |
|
((((fourierSchwartzLM (d := d)) ψ).toLp (2 : ℝ≥0∞) (volume : Measure (Rd d))) x)) |
|
=ᵐ[(volume : Measure (Rd d))] fun x : Rd d => ((fourierSchwartzLM (d := d)) ψ) x := |
|
SchwartzMap.coeFn_toLp (f := ((fourierSchwartzLM (d := d)) ψ)) (p := (2 : ℝ≥0∞)) |
|
(μ := (volume : Measure (Rd d))) |
|
simpa [hY_toLp, hF] using h1 |
|
|
|
have hinner : inner (𝕜 := ℂ) Y Y = inner (𝕜 := ℂ) X X := by |
|
have hY_inner : |
|
inner (𝕜 := ℂ) Y Y = |
|
∫ x : Rd d, (𝓕 (fun y : Rd d => ψ y) x) * conj (𝓕 (fun y : Rd d => ψ y) x) |
|
∂(volume : Measure (Rd d)) := by |
|
have hYint : |
|
(fun x : Rd d => inner (𝕜 := ℂ) (Y x) (Y x)) |
|
=ᵐ[(volume : Measure (Rd d))] fun x : Rd d => |
|
inner (𝕜 := ℂ) (𝓕 (fun y : Rd d => ψ y) x) (𝓕 (fun y : Rd d => ψ y) x) := by |
|
filter_upwards [hY_ae] with x hx |
|
simp [hx] |
|
have hYint' : |
|
(fun x : Rd d => |
|
inner (𝕜 := ℂ) (𝓕 (fun y : Rd d => ψ y) x) (𝓕 (fun y : Rd d => ψ y) x)) |
|
= fun x : Rd d => (𝓕 (fun y : Rd d => ψ y) x) * conj (𝓕 (fun y : Rd d => ψ y) x) := by |
|
funext x; simp |
|
calc |
|
inner (𝕜 := ℂ) Y Y |
|
= ∫ x : Rd d, inner (𝕜 := ℂ) (Y x) (Y x) ∂(volume : Measure (Rd d)) := by |
|
simp [MeasureTheory.L2.inner_def] |
|
_ = ∫ x : Rd d, |
|
inner (𝕜 := ℂ) (𝓕 (fun y : Rd d => ψ y) x) (𝓕 (fun y : Rd d => ψ y) x) |
|
∂(volume : Measure (Rd d)) := by |
|
exact integral_congr_ae hYint |
|
_ = ∫ x : Rd d, (𝓕 (fun y : Rd d => ψ y) x) * conj (𝓕 (fun y : Rd d => ψ y) x) |
|
∂(volume : Measure (Rd d)) := by |
|
simp |
|
|
|
have hX_inner : |
|
inner (𝕜 := ℂ) X X = |
|
∫ x : Rd d, (ψ x) * conj (ψ x) ∂(volume : Measure (Rd d)) := by |
|
have hXint : |
|
(fun x : Rd d => inner (𝕜 := ℂ) (X x) (X x)) |
|
=ᵐ[(volume : Measure (Rd d))] fun x : Rd d => inner (𝕜 := ℂ) (ψ x) (ψ x) := by |
|
filter_upwards [hX_ae] with x hx |
|
simp [hx] |
|
have hXint' : |
|
(fun x : Rd d => inner (𝕜 := ℂ) (ψ x) (ψ x)) |
|
= fun x : Rd d => (ψ x) * conj (ψ x) := by |
|
funext x; simp |
|
calc |
|
inner (𝕜 := ℂ) X X |
|
= ∫ x : Rd d, inner (𝕜 := ℂ) (X x) (X x) ∂(volume : Measure (Rd d)) := by |
|
simp [MeasureTheory.L2.inner_def] |
|
_ = ∫ x : Rd d, inner (𝕜 := ℂ) (ψ x) (ψ x) ∂(volume : Measure (Rd d)) := by |
|
exact integral_congr_ae hXint |
|
_ = ∫ x : Rd d, (ψ x) * conj (ψ x) ∂(volume : Measure (Rd d)) := by |
|
simp |
|
|
|
have hParseval0 := |
|
FourierParsevalSchwartz.parseval_integral (d := d) ψ |
|
|
|
have hParseval : |
|
(∫ x : Rd d, (𝓕 (fun y : Rd d => ψ y) x) * conj (𝓕 (fun y : Rd d => ψ y) x) |
|
∂(volume : Measure (Rd d))) |
|
= |
|
(∫ x : Rd d, (ψ x) * conj (ψ x) ∂(volume : Measure (Rd d))) := by |
|
have hL : |
|
(∫ x : Rd d, conj (𝓕 (fun y : Rd d => ψ y) x) * (𝓕 (fun y : Rd d => ψ y) x) |
|
∂(volume : Measure (Rd d))) |
|
= |
|
(∫ x : Rd d, (𝓕 (fun y : Rd d => ψ y) x) * conj (𝓕 (fun y : Rd d => ψ y) x) |
|
∂(volume : Measure (Rd d))) := by |
|
refine integral_congr_ae (Filter.Eventually.of_forall ?_) |
|
intro x |
|
simp [mul_comm] |
|
have hR : |
|
(∫ x : Rd d, conj (ψ x) * (ψ x) ∂(volume : Measure (Rd d))) |
|
= |
|
(∫ x : Rd d, (ψ x) * conj (ψ x) ∂(volume : Measure (Rd d))) := by |
|
refine integral_congr_ae (Filter.Eventually.of_forall ?_) |
|
intro x |
|
simp [mul_comm] |
|
exact hL ▸ (hParseval0.trans hR) |
|
|
|
simpa [hY_inner, hX_inner] using congrArg id hParseval |
|
|
|
have hsqC : (‖Y‖ : ℂ) ^ 2 = (‖X‖ : ℂ) ^ 2 := by |
|
have hy : inner (𝕜 := ℂ) Y Y = (‖Y‖ : ℂ) ^ 2 := by |
|
simpa using (inner_self_eq_norm_sq_to_K (𝕜 := ℂ) (x := Y)) |
|
have hx : inner (𝕜 := ℂ) X X = (‖X‖ : ℂ) ^ 2 := by |
|
simpa using (inner_self_eq_norm_sq_to_K (𝕜 := ℂ) (x := X)) |
|
calc |
|
(‖Y‖ : ℂ) ^ 2 = inner (𝕜 := ℂ) Y Y := by |
|
simpa using hy.symm |
|
_ = inner (𝕜 := ℂ) X X := hinner |
|
_ = (‖X‖ : ℂ) ^ 2 := by |
|
simpa using hx |
|
|
|
have hsqR : ‖Y‖ ^ 2 = ‖X‖ ^ 2 := by |
|
have hsqC' : (Complex.ofReal (‖Y‖ ^ 2)) = Complex.ofReal (‖X‖ ^ 2) := by |
|
simpa using hsqC |
|
exact Complex.ofReal_inj.mp hsqC' |
|
|
|
have hmul : ‖Y‖ * ‖Y‖ = ‖X‖ * ‖X‖ := by |
|
simpa [pow_two] using hsqR |
|
|
|
rcases mul_self_eq_mul_self_iff.mp hmul with h | h |
|
· exact h |
|
· |
|
have hY_nonneg : 0 ≤ ‖Y‖ := norm_nonneg _ |
|
have hX_nonneg : 0 ≤ ‖X‖ := norm_nonneg _ |
|
have hX_le0 : ‖X‖ ≤ 0 := by |
|
have : 0 ≤ -‖X‖ := by simpa [h] using hY_nonneg |
|
exact neg_nonneg.mp this |
|
have hX0 : ‖X‖ = 0 := le_antisymm hX_le0 hX_nonneg |
|
have hY0 : ‖Y‖ = 0 := by |
|
calc |
|
‖Y‖ = -‖X‖ := h |
|
_ = -0 := by simp [hX0] |
|
_ = 0 := by simp |
|
-- 両辺とも 0 |
|
calc |
|
‖Y‖ = 0 := hY0 |
|
_ = ‖X‖ := by simp [hX0] |
|
|
|
/-! |
|
## ここから: `L²` 全域への延長(稠密延長) |
|
|
|
Wikipedia では `S′`(緩増加超関数)を経由する定義も説明されますが、 |
|
ここでは **Hilbert 空間の一般論**として、 |
|
|
|
- `S := range(schwartzToL2LM)`(`L²` の稠密部分空間)上で等長(Plancherel) |
|
- `ContinuousLinearMap.extend` で `L² →L L²` に一意延長 |
|
|
|
というルートを採用します。 |
|
-/ |
|
|
|
theorem schwartzToL2LM_injective (d : ℕ) : Function.Injective (schwartzToL2LM (d := d)) := by |
|
classical |
|
intro f g h |
|
let μ : Measure (Rd d) := (volume : Measure (Rd d)) |
|
haveI : μ.HasTemperateGrowth := by infer_instance |
|
haveI : μ.IsOpenPosMeasure := by infer_instance |
|
have htoLp : f.toLp (2 : ℝ≥0∞) μ = g.toLp (2 : ℝ≥0∞) μ := by |
|
simpa [schwartzToL2LM, SchwartzMap.toLpCLM_apply] using h |
|
exact (SchwartzMap.injective_toLp (E := Rd d) (F := ℂ) (p := (2 : ℝ≥0∞)) (μ := μ)) htoLp |
|
|
|
/-- `S = range(schwartzToL2LM)` を `L²` の部分空間として見る。 -/ |
|
noncomputable abbrev SchwartzRangeL2 (d : ℕ) : Submodule ℂ (L2Rd d) := |
|
LinearMap.range (schwartzToL2LM (d := d)) |
|
|
|
/-- Schwartz と `range(schwartzToL2LM)` の同型(単射なので `ofInjective` を使う)。 -/ |
|
noncomputable def schwartzEquivRange (d : ℕ) : |
|
SchwartzRd d ≃ₗ[ℂ] ↥(SchwartzRangeL2 (d := d)) := |
|
LinearEquiv.ofInjective (schwartzToL2LM (d := d)) (schwartzToL2LM_injective (d := d)) |
|
|
|
/-- `SchwartzRangeL2` 上の「フーリエ」線形写像(`LinearMap`)。 -/ |
|
noncomputable def fourierOnSchwartzRangeLM (d : ℕ) : |
|
SchwartzRangeL2 (d := d) →ₗ[ℂ] L2Rd d := |
|
(fourierToL2LM (d := d)).comp (schwartzEquivRange (d := d)).symm.toLinearMap |
|
|
|
/-- `fourierOnSchwartzRangeLM` が等長(ノルム保存)である、という形にまとめた仮定。 -/ |
|
structure PlancherelOnSchwartzRange (d : ℕ) : Prop where |
|
norm_map : ∀ s : SchwartzRangeL2 (d := d), |
|
‖fourierOnSchwartzRangeLM (d := d) s‖ = ‖s‖ |
|
|
|
/-- `plancherel_schwartz_toL2` から `SchwartzRangeL2` 上の等長性を作る。 -/ |
|
noncomputable def plancherelOnSchwartzRange (d : ℕ) : PlancherelOnSchwartzRange (d := d) := by |
|
classical |
|
refine ⟨?_⟩ |
|
intro s |
|
-- 代表元を Schwartz に引き戻す |
|
let ψ : SchwartzRd d := (schwartzEquivRange (d := d)).symm s |
|
have hs : schwartzToL2LM (d := d) ψ = (s : L2Rd d) := by |
|
have : (schwartzEquivRange (d := d) ψ) = s := by |
|
simpa [ψ] using (LinearEquiv.apply_symm_apply (schwartzEquivRange (d := d)) s) |
|
simpa [schwartzEquivRange] using congrArg Subtype.val this |
|
have hFourier : fourierOnSchwartzRangeLM (d := d) s = fourierToL2LM (d := d) ψ := by |
|
rfl |
|
calc |
|
‖fourierOnSchwartzRangeLM (d := d) s‖ |
|
= ‖fourierToL2LM (d := d) ψ‖ := by |
|
simp [hFourier] |
|
_ = ‖schwartzToL2LM (d := d) ψ‖ := plancherel_schwartz_toL2 (d := d) ψ |
|
_ = ‖(s : L2Rd d)‖ := by |
|
simp [hs] |
|
_ = ‖s‖ := by |
|
rfl |
|
|
|
/-- `SchwartzRangeL2` 上の等長線形写像を `→ₗᵢ` として束ねる。 -/ |
|
noncomputable def fourierOnSchwartzRangeLI (d : ℕ) : |
|
SchwartzRangeL2 (d := d) →ₗᵢ[ℂ] L2Rd d where |
|
toLinearMap := fourierOnSchwartzRangeLM (d := d) |
|
norm_map' := (plancherelOnSchwartzRange (d := d)).norm_map |
|
|
|
/-- `SchwartzRangeL2`(= `range(schwartzToL2LM)`)が `L²` で稠密。 -/ |
|
theorem dense_schwartzRangeL2 (d : ℕ) : |
|
Dense ((SchwartzRangeL2 (d := d) : Submodule ℂ (L2Rd d)) : Set (L2Rd d)) := by |
|
classical |
|
-- 既にリポジトリ側で(公理なしで)証明済みの稠密性を再利用する。 |
|
simpa [SchwartzRangeL2, schwartzToL2LM, QuantumMechanics.FourierL2.schwartzToL2LM] using |
|
(QuantumMechanics.FourierL2.dense_range_schwartzToL2LM (d := d)) |
|
|
|
/-- `S ↪ L²`(`subtypeL`)は稠密埋め込み(`S` が稠密なら)。 -/ |
|
theorem denseRange_subtypeL_schwartzRangeL2 (d : ℕ) : |
|
DenseRange ((SchwartzRangeL2 (d := d)).subtypeL) := by |
|
simpa using (dense_schwartzRangeL2 (d := d)).denseRange_val |
|
|
|
/-- `L² →L L²` 上のフーリエ作用素(稠密延長)。 -/ |
|
noncomputable def fourierL2CLM (d : ℕ) : L2Rd d →L[ℂ] L2Rd d := by |
|
let S : Submodule ℂ (L2Rd d) := SchwartzRangeL2 (d := d) |
|
have hDense : DenseRange (S.subtypeL) := denseRange_subtypeL_schwartzRangeL2 (d := d) |
|
have hIso : Isometry (⇑S.subtypeL) := by |
|
intro x y |
|
rfl |
|
have h_e : IsUniformInducing (⇑S.subtypeL) := Isometry.isUniformInducing hIso |
|
-- `S →ₗᵢ L²` を `S →L L²` に束ね、稠密埋め込み `S ↪ L²` 沿いに延長 |
|
exact |
|
ContinuousLinearMap.extend |
|
(f := (fourierOnSchwartzRangeLI (d := d)).toContinuousLinearMap) |
|
(e := S.subtypeL) |
|
(h_dense := hDense) |
|
(h_e := h_e) |
|
|
|
/-- 延長は `SchwartzRangeL2` 上で元の写像と一致する。 -/ |
|
theorem fourierL2CLM_apply_subtype (d : ℕ) (s : SchwartzRangeL2 (d := d)) : |
|
fourierL2CLM (d := d) (s : L2Rd d) = fourierOnSchwartzRangeLM (d := d) s := by |
|
classical |
|
let S : Submodule ℂ (L2Rd d) := SchwartzRangeL2 (d := d) |
|
let f0 : S →L[ℂ] L2Rd d := (fourierOnSchwartzRangeLI (d := d)).toContinuousLinearMap |
|
have hDense : DenseRange (S.subtypeL) := denseRange_subtypeL_schwartzRangeL2 (d := d) |
|
have hIso : Isometry (⇑S.subtypeL) := by |
|
intro x y |
|
rfl |
|
have h_e : IsUniformInducing (⇑S.subtypeL) := Isometry.isUniformInducing hIso |
|
simpa [fourierL2CLM, S, f0, hDense, h_e] using |
|
(ContinuousLinearMap.extend_eq (f := f0) (e := S.subtypeL) (h_dense := hDense) (h_e := h_e) s) |
|
|
|
end FourierL2 |
|
|
|
end QuantumMechanicsStandalone |