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

Commit 6d90d35

Browse files
committed
feat(analysis/fourier): monomials on the circle are orthonormal (#6952)
Make the circle into a measure space, using Haar measure, and prove that the monomials `z ^ n` are orthonormal when considered as elements of L^2 on the circle.
1 parent 4b31247 commit 6d90d35

File tree

7 files changed

+224
-16
lines changed

7 files changed

+224
-16
lines changed

src/analysis/fourier.lean

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/-
2+
Copyright (c) 2021 Heather Macbeth. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Heather Macbeth
5+
-/
6+
import measure_theory.l2_space
7+
import measure_theory.haar_measure
8+
import geometry.manifold.instances.circle
9+
10+
/-!
11+
12+
# Fourier analysis on the circle
13+
14+
This file contains some first steps towards Fourier series.
15+
16+
## Main definitions
17+
18+
* `haar_circle`, Haar measure on the circle, normalized to have total measure `1`
19+
* instances `measure_space`, `probability_measure` for the circle with respect to this measure
20+
* for `n : ℤ`, `fourier n` is the monomial `λ z, z ^ n`, bundled as a continuous map from `circle`
21+
to `ℂ`
22+
23+
## Main statements
24+
25+
The theorem `orthonormal_fourier` states that the functions `fourier n`, when sent via
26+
`continuous_map.to_Lp` to the L^2 space on the circle, form an orthonormal set.
27+
28+
## TODO
29+
30+
* Show that `submodule.span fourier` is dense in `C(circle, ℂ)`, i.e. that its
31+
`submodule.topological_closure` is `⊤`. This follows from the Stone-Weierstrass theorem after
32+
checking that it is a subalgebra, closed under conjugation, and separates points.
33+
* Show that the image of `submodule.span fourier` under `continuous_map.to_Lp` is dense in the
34+
`L^2` space on the circle, and thus that the functions `fourier` form a Hilbert basis. This
35+
follows from the previous result using general theory on approximation by continuous functions.
36+
37+
-/
38+
39+
noncomputable theory
40+
open topological_space continuous_map measure_theory measure_theory.measure
41+
42+
local attribute [instance] fact_one_le_two_ennreal
43+
44+
section haar_circle
45+
/-! We make the circle into a measure space, using the Haar measure normalized to have total
46+
measure 1. -/
47+
48+
instance : measurable_space circle := borel circle
49+
instance : borel_space circle := ⟨rfl⟩
50+
51+
/-- Haar measure on the circle, normalized to have total measure 1. -/
52+
def haar_circle : measure circle := haar_measure positive_compacts_univ
53+
54+
instance : probability_measure haar_circle := ⟨haar_measure_self⟩
55+
56+
instance : measure_space circle :=
57+
{ volume := haar_circle,
58+
.. circle.measurable_space }
59+
60+
end haar_circle
61+
62+
section fourier
63+
64+
/-- The family of monomials `λ z, z ^ n`, parametrized by `n : ℤ` and considered as bundled
65+
continuous maps from `circle` to `ℂ`. -/
66+
@[simps] def fourier (n : ℤ) : C(circle, ℂ) :=
67+
{ to_fun := λ z, z ^ n,
68+
continuous_to_fun := continuous_subtype_coe.fpow nonzero_of_mem_circle n }
69+
70+
@[simp] lemma fourier_zero {z : circle} : fourier 0 z = 1 := rfl
71+
72+
@[simp] lemma fourier_neg {n : ℤ} {z : circle} : fourier (-n) z = complex.conj (fourier n z) :=
73+
by simp [← coe_inv_circle_eq_conj z]
74+
75+
@[simp] lemma fourier_add {m n : ℤ} {z : circle} :
76+
fourier (m + n) z = (fourier m z) * (fourier n z) :=
77+
by simp [fpow_add (nonzero_of_mem_circle z)]
78+
79+
/-- For `n ≠ 0`, a rotation by `n⁻¹ * real.pi` negates the monomial `z ^ n`. -/
80+
lemma fourier_add_half_inv_index {n : ℤ} (hn : n ≠ 0) (z : circle) :
81+
fourier n ((exp_map_circle (n⁻¹ * real.pi) * z)) = - fourier n z :=
82+
begin
83+
have : ↑n * ((↑n)⁻¹ * ↑real.pi * complex.I) = ↑real.pi * complex.I,
84+
{ have : (n:ℂ) ≠ 0 := by exact_mod_cast hn,
85+
field_simp,
86+
ring },
87+
simp [mul_fpow, ← complex.exp_int_mul, complex.exp_pi_mul_I, this]
88+
end
89+
90+
/-- The monomials `z ^ n` are an orthonormal set with respect to Haar measure on the circle. -/
91+
lemma orthonormal_fourier : orthonormal ℂ (λ n, to_Lp 2 haar_circle ℂ (fourier n)) :=
92+
begin
93+
rw orthonormal_iff_ite,
94+
intros i j,
95+
rw continuous_map.inner_to_Lp haar_circle (fourier i) (fourier j),
96+
split_ifs,
97+
{ simp [h, probability_measure.measure_univ, ← fourier_neg, ← fourier_add, -fourier_to_fun] },
98+
simp only [← fourier_add, ← fourier_neg, is_R_or_C.conj_to_complex],
99+
have hij : -i + j ≠ 0,
100+
{ rw add_comm,
101+
exact sub_ne_zero.mpr (ne.symm h) },
102+
exact integral_zero_of_mul_left_eq_neg (is_mul_left_invariant_haar_measure _)
103+
(fourier_add_half_inv_index hij)
104+
end
105+
106+
end fourier

src/data/complex/exponential.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,14 @@ by rw [← mul_right_inj' (exp_ne_zero x), ← exp_add];
471471
lemma exp_sub : exp (x - y) = exp x / exp y :=
472472
by simp [sub_eq_add_neg, exp_add, exp_neg, div_eq_mul_inv]
473473

474+
lemma exp_int_mul (z : ℂ) (n : ℤ) : complex.exp (n * z) = (complex.exp z) ^ n :=
475+
begin
476+
cases n,
477+
{ apply complex.exp_nat_mul },
478+
{ simpa [complex.exp_neg, add_comm, ← neg_mul_eq_neg_mul_symm]
479+
using complex.exp_nat_mul (-z) (1 + n) },
480+
end
481+
474482
@[simp] lemma exp_conj : exp (conj x) = conj (exp x) :=
475483
begin
476484
dsimp [exp],

src/geometry/manifold/instances/circle.lean

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,30 @@ lemma circle_def : ↑circle = {z : ℂ | abs z = 1} := by { ext, simp }
5454

5555
@[simp] lemma abs_eq_of_mem_circle (z : circle) : abs z = 1 := by { convert z.2, simp }
5656

57+
@[simp] lemma norm_sq_eq_of_mem_circle (z : circle) : norm_sq z = 1 := by simp [norm_sq_eq_abs]
58+
59+
lemma nonzero_of_mem_circle (z : circle) : (z:ℂ) ≠ 0 := nonzero_of_mem_unit_sphere z
60+
5761
instance : group circle :=
5862
{ inv := λ z, ⟨conj z, by simp⟩,
5963
mul_left_inv := λ z, subtype.ext $ by { simp [has_inv.inv, ← norm_sq_eq_conj_mul_self,
6064
← mul_self_abs] },
6165
.. circle.to_monoid }
6266

63-
@[simp] lemma coe_inv_circle (z : circle) : ↑(z⁻¹) = conj z := rfl
64-
@[simp] lemma coe_div_circle (z w : circle) : ↑(z / w) = ↑z * conj w := rfl
67+
lemma coe_inv_circle_eq_conj (z : circle) : ↑(z⁻¹) = conj z := rfl
68+
69+
@[simp] lemma coe_inv_circle (z : circle) : ↑(z⁻¹) = (z : ℂ)⁻¹ :=
70+
begin
71+
rw coe_inv_circle_eq_conj,
72+
apply eq_inv_of_mul_right_eq_one,
73+
rw [mul_comm, ← complex.norm_sq_eq_conj_mul_self],
74+
simp,
75+
end
76+
77+
@[simp] lemma coe_div_circle (z w : circle) : ↑(z / w) = (z:ℂ) / w :=
78+
show ↑(z * w⁻¹) = (z:ℂ) * w⁻¹, by simp
79+
80+
instance : compact_space circle := metric.sphere.compact_space _ _
6581

6682
-- the following result could instead be deduced from the Lie group structure on the circle using
6783
-- `topological_group_of_lie_group`, but that seems a little awkward since one has to first provide
@@ -98,6 +114,9 @@ instance : lie_group (𝓡 1) circle :=
98114
def exp_map_circle (t : ℝ) : circle :=
99115
⟨exp (t * I), by simp [exp_mul_I, abs_cos_add_sin_mul_I]⟩
100116

117+
@[simp] lemma exp_map_circle_apply (t : ℝ) : ↑(exp_map_circle t) = complex.exp (t * complex.I) :=
118+
rfl
119+
101120
/-- The map `λ t, exp (t * I)` from `ℝ` to the unit circle in `ℂ`, considered as a homomorphism of
102121
groups. -/
103122
def exp_map_circle_hom : ℝ →+ (additive circle) :=

src/measure_theory/l2_space.lean

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,51 @@ instance inner_product_space : inner_product_space 𝕜 (α →₂[μ] E) :=
135135
end inner_product_space
136136

137137
end L2
138+
139+
section inner_continuous
140+
141+
variables {α : Type*} [topological_space α] [measure_space α] [borel_space α] {𝕜 : Type*}
142+
[is_R_or_C 𝕜] [measurable_space 𝕜] [borel_space 𝕜]
143+
variables (μ : measure α) [finite_measure μ]
144+
145+
open_locale bounded_continuous_function
146+
147+
local attribute [instance] fact_one_le_two_ennreal
148+
149+
local notation `⟪`x`, `y`⟫` := @inner 𝕜 (α →₂[μ] 𝕜) _ x y
150+
151+
/-- For bounded continuous functions `f`, `g` on a finite-measure topological space `α`, the L^2
152+
inner product is the integral of their pointwise inner product. -/
153+
lemma bounded_continuous_function.inner_to_Lp (f g : α →ᵇ 𝕜) :
154+
⟪bounded_continuous_function.to_Lp 2 μ 𝕜 f, bounded_continuous_function.to_Lp 2 μ 𝕜 g⟫
155+
= ∫ x, is_R_or_C.conj (f x) * g x ∂μ :=
156+
begin
157+
apply integral_congr_ae,
158+
have hf_ae := f.coe_fn_to_Lp μ,
159+
have hg_ae := g.coe_fn_to_Lp μ,
160+
filter_upwards [hf_ae, hg_ae],
161+
intros x hf hg,
162+
rw [hf, hg],
163+
simp
164+
end
165+
166+
variables [compact_space α]
167+
168+
/-- For continuous functions `f`, `g` on a compact, finite-measure topological space `α`, the L^2
169+
inner product is the integral of their pointwise inner product. -/
170+
lemma continuous_map.inner_to_Lp (f g : C(α, 𝕜)) :
171+
⟪continuous_map.to_Lp 2 μ 𝕜 f, continuous_map.to_Lp 2 μ 𝕜 g⟫
172+
= ∫ x, is_R_or_C.conj (f x) * g x ∂μ :=
173+
begin
174+
apply integral_congr_ae,
175+
have hf_ae := f.coe_fn_to_Lp μ,
176+
have hg_ae := g.coe_fn_to_Lp μ,
177+
filter_upwards [hf_ae, hg_ae],
178+
intros x hf hg,
179+
rw [hf, hg],
180+
simp
181+
end
182+
183+
end inner_continuous
184+
138185
end measure_theory

src/measure_theory/lp_space.lean

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1761,7 +1761,7 @@ begin
17611761
{ apply_instance }
17621762
end
17631763

1764-
variables (E p μ)
1764+
variables (p μ)
17651765

17661766
/-- The normed group homomorphism of considering a bounded continuous function on a finite-measure
17671767
space as an element of `Lp`. -/
@@ -1786,11 +1786,16 @@ linear_map.mk_continuous
17861786
_
17871787
Lp_norm_le
17881788

1789-
variables {E p 𝕜}
1789+
variables {p 𝕜}
1790+
1791+
lemma coe_fn_to_Lp [normed_field 𝕜] [opens_measurable_space 𝕜] [normed_space 𝕜 E] [fact (1 ≤ p)]
1792+
(f : α →ᵇ E) :
1793+
to_Lp p μ 𝕜 f =ᵐ[μ] f :=
1794+
ae_eq_fun.coe_fn_mk f _
17901795

17911796
lemma to_Lp_norm_le [nondiscrete_normed_field 𝕜] [opens_measurable_space 𝕜] [normed_space 𝕜 E]
17921797
[fact (1 ≤ p)] :
1793-
∥to_Lp E p μ 𝕜∥ ≤ (measure_univ_nnreal μ) ^ (p.to_real)⁻¹ :=
1798+
@to_Lp _ E _ p μ _ _ _ _ _ _ _ 𝕜 _ _ _ _ _∥ ≤ (measure_univ_nnreal μ) ^ (p.to_real)⁻¹ :=
17941799
linear_map.mk_continuous_norm_le _ ((measure_univ_nnreal μ) ^ (p.to_real)⁻¹).coe_nonneg _
17951800

17961801
end bounded_continuous_function
@@ -1803,43 +1808,49 @@ variables [borel_space E] [second_countable_topology E]
18031808
variables [topological_space α] [compact_space α] [borel_space α]
18041809
variables [finite_measure μ]
18051810

1806-
variables (𝕜 : Type*) [measurable_space 𝕜] (E p μ) [fact (1 ≤ p)]
1811+
variables (𝕜 : Type*) [measurable_space 𝕜] (p μ) [fact (1 ≤ p)]
18071812

18081813
/-- The bounded linear map of considering a continuous function on a compact finite-measure
18091814
space `α` as an element of `Lp`. By definition, the norm on `C(α, E)` is the sup-norm, transferred
18101815
from the space `α →ᵇ E` of bounded continuous functions, so this construction is just a matter of
18111816
transferring the structure from `bounded_continuous_function.to_Lp` along the isometry. -/
18121817
def to_Lp [normed_field 𝕜] [opens_measurable_space 𝕜] [normed_space 𝕜 E] :
18131818
C(α, E) →L[𝕜] (Lp E p μ) :=
1814-
(bounded_continuous_function.to_Lp E p μ 𝕜).comp
1819+
(bounded_continuous_function.to_Lp p μ 𝕜).comp
18151820
(linear_isometry_bounded_of_compact α E 𝕜).to_linear_isometry.to_continuous_linear_map
18161821

1817-
variables {E p 𝕜}
1822+
variables {p 𝕜}
1823+
1824+
lemma coe_fn_to_Lp [normed_field 𝕜] [opens_measurable_space 𝕜] [normed_space 𝕜 E] (f : C(α, E)) :
1825+
to_Lp p μ 𝕜 f =ᵐ[μ] f :=
1826+
ae_eq_fun.coe_fn_mk f _
18181827

18191828
lemma to_Lp_def [normed_field 𝕜] [opens_measurable_space 𝕜] [normed_space 𝕜 E] (f : C(α, E)) :
1820-
to_Lp E p μ 𝕜 f
1821-
= bounded_continuous_function.to_Lp E p μ 𝕜 (linear_isometry_bounded_of_compact α E 𝕜 f) :=
1829+
to_Lp p μ 𝕜 f
1830+
= bounded_continuous_function.to_Lp p μ 𝕜 (linear_isometry_bounded_of_compact α E 𝕜 f) :=
18221831
rfl
18231832

18241833
@[simp] lemma to_Lp_comp_forget_boundedness [normed_field 𝕜] [opens_measurable_space 𝕜]
18251834
[normed_space 𝕜 E] (f : α →ᵇ E) :
1826-
to_Lp E p μ 𝕜 (bounded_continuous_function.forget_boundedness α E f)
1827-
= bounded_continuous_function.to_Lp E p μ 𝕜 f :=
1835+
to_Lp p μ 𝕜 (bounded_continuous_function.forget_boundedness α E f)
1836+
= bounded_continuous_function.to_Lp p μ 𝕜 f :=
18281837
rfl
18291838

18301839
@[simp] lemma coe_to_Lp [normed_field 𝕜] [opens_measurable_space 𝕜] [normed_space 𝕜 E]
18311840
(f : C(α, E)) :
1832-
(to_Lp E p μ 𝕜 f : α →ₘ[μ] E) = f.to_ae_eq_fun μ :=
1841+
(to_Lp p μ 𝕜 f : α →ₘ[μ] E) = f.to_ae_eq_fun μ :=
18331842
rfl
18341843

18351844
variables [nondiscrete_normed_field 𝕜] [opens_measurable_space 𝕜] [normed_space 𝕜 E]
18361845

18371846
lemma to_Lp_norm_eq_to_Lp_norm_coe :
1838-
∥to_Lp E p μ 𝕜∥ = ∥bounded_continuous_function.to_Lp E p μ 𝕜∥ :=
1839-
(bounded_continuous_function.to_Lp E p μ 𝕜).op_norm_comp_linear_isometry_equiv _
1847+
∥@to_Lp _ E _ p μ _ _ _ _ _ _ _ _ 𝕜 _ _ _ _ _∥
1848+
= ∥@bounded_continuous_function.to_Lp _ E _ p μ _ _ _ _ _ _ _ 𝕜 _ _ _ _ _∥ :=
1849+
continuous_linear_map.op_norm_comp_linear_isometry_equiv _ _
18401850

18411851
/-- Bound for the operator norm of `continuous_map.to_Lp`. -/
1842-
lemma to_Lp_norm_le : ∥to_Lp E p μ 𝕜∥ ≤ (measure_univ_nnreal μ) ^ (p.to_real)⁻¹ :=
1852+
lemma to_Lp_norm_le :
1853+
∥@to_Lp _ E _ p μ _ _ _ _ _ _ _ _ 𝕜 _ _ _ _ _∥ ≤ (measure_univ_nnreal μ) ^ (p.to_real)⁻¹ :=
18431854
by { rw to_Lp_norm_eq_to_Lp_norm_coe, exact bounded_continuous_function.to_Lp_norm_le μ }
18441855

18451856
end continuous_map

src/topology/compacts.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ instance nonempty_compacts_inhabited [inhabited α] : inhabited (nonempty_compac
4848
@[nolint has_inhabited_instance]
4949
def positive_compacts: Type* := { s : set α // is_compact s ∧ (interior s).nonempty }
5050

51+
/-- In a nonempty compact space, `set.univ` is a member of `positive_compacts`, the compact sets
52+
with nonempty interior. -/
53+
def positive_compacts_univ {α : Type*} [topological_space α] [compact_space α] [nonempty α] :
54+
positive_compacts α :=
55+
⟨set.univ, compact_univ, by simp⟩
56+
5157
variables {α}
5258

5359
namespace compacts

src/topology/metric_space/basic.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,6 +1320,17 @@ open metric
13201320
class proper_space (α : Type u) [pseudo_metric_space α] : Prop :=
13211321
(compact_ball : ∀x:α, ∀r, is_compact (closed_ball x r))
13221322

1323+
/-- In a proper pseudometric space, all spheres are compact. -/
1324+
lemma is_compact_sphere {α : Type*} [pseudo_metric_space α] [proper_space α] (x : α) (r : ℝ) :
1325+
is_compact (sphere x r) :=
1326+
compact_of_is_closed_subset (proper_space.compact_ball x r) is_closed_sphere
1327+
sphere_subset_closed_ball
1328+
1329+
/-- In a proper pseudometric space, any sphere is a `compact_space` when considered as a subtype. -/
1330+
instance {α : Type*} [pseudo_metric_space α] [proper_space α] (x : α) (r : ℝ) :
1331+
compact_space (sphere x r) :=
1332+
is_compact_iff_compact_space.mp (is_compact_sphere _ _)
1333+
13231334
/-- A proper pseudo metric space is sigma compact, and therefore second countable. -/
13241335
@[priority 100] -- see Note [lower instance priority]
13251336
instance second_countable_of_proper [proper_space α] :

0 commit comments

Comments
 (0)