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

Commit 223e742

Browse files
committed
feat(analysis/*/{exponential, spectrum}): spectrum of a selfadjoint element is real (#12417)
This provides several properties of the exponential function and uses it to prove that for `𝕜 = ℝ` or `𝕜 = ℂ`, `exp 𝕜 𝕜` maps the spectrum of `a : A` (where `A` is a `𝕜`-algebra) into the spectrum of `exp 𝕜 A a`. In addition, `exp ℂ A (I • a)` is unitary when `a` is selfadjoint. Consequently, the spectrum of a selfadjoint element is real.
1 parent 7d34f78 commit 223e742

File tree

5 files changed

+186
-4
lines changed

5 files changed

+186
-4
lines changed

src/analysis/normed_space/basic.lean

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,20 @@ end
359359

360360
variables (𝕜 : Type*) (𝕜' : Type*) [normed_field 𝕜]
361361

362+
/-- The inclusion of the base field in a normed algebra as a continuous linear map. -/
363+
@[simps]
364+
def algebra_map_clm [semi_normed_ring 𝕜'] [normed_algebra 𝕜 𝕜'] : 𝕜 →L[𝕜] 𝕜' :=
365+
{ to_fun := algebra_map 𝕜 𝕜',
366+
map_add' := (algebra_map 𝕜 𝕜').map_add,
367+
map_smul' := λ r x, by rw [algebra.id.smul_eq_mul, map_mul, ring_hom.id_apply, algebra.smul_def],
368+
cont := (algebra_map_isometry 𝕜 𝕜').continuous }
369+
370+
lemma algebra_map_clm_coe [semi_normed_ring 𝕜'] [normed_algebra 𝕜 𝕜'] :
371+
(algebra_map_clm 𝕜 𝕜' : 𝕜 → 𝕜') = (algebra_map 𝕜 𝕜' : 𝕜 → 𝕜') := rfl
372+
373+
lemma algebra_map_clm_to_linear_map [semi_normed_ring 𝕜'] [normed_algebra 𝕜 𝕜'] :
374+
(algebra_map_clm 𝕜 𝕜').to_linear_map = algebra.linear_map 𝕜 𝕜' := rfl
375+
362376
@[priority 100]
363377
instance normed_algebra.to_normed_space [semi_normed_ring 𝕜'] [h : normed_algebra 𝕜 𝕜'] :
364378
normed_space 𝕜 𝕜' :=

src/analysis/normed_space/exponential.lean

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,17 @@ end
210210

211211
end complete_algebra
212212

213+
lemma algebra_map_exp_comm_of_mem_ball [complete_space 𝕂] (x : 𝕂)
214+
(hx : x ∈ emetric.ball (0 : 𝕂) (exp_series 𝕂 𝕂).radius) :
215+
algebra_map 𝕂 𝔸 (exp 𝕂 𝕂 x) = exp 𝕂 𝔸 (algebra_map 𝕂 𝔸 x) :=
216+
begin
217+
convert (algebra_map_clm 𝕂 𝔸).map_tsum (exp_series_field_summable_of_mem_ball x hx),
218+
{ exact congr_fun exp_eq_tsum_field x },
219+
{ convert congr_fun (exp_eq_tsum : exp 𝕂 𝔸 = _) (algebra_map 𝕂 𝔸 x),
220+
simp_rw [←map_pow, ←algebra_map_clm_coe, ←(algebra_map_clm 𝕂 𝔸).map_smul, smul_eq_mul,
221+
mul_comm, ←div_eq_mul_one_div], }
222+
end
223+
213224
end any_field_any_algebra
214225

215226
section any_field_comm_algebra
@@ -318,6 +329,10 @@ lemma exp_add_of_commute [complete_space 𝔸]
318329
exp_add_of_commute_of_mem_ball hxy ((exp_series_radius_eq_top 𝕂 𝔸).symm ▸ edist_lt_top _ _)
319330
((exp_series_radius_eq_top 𝕂 𝔸).symm ▸ edist_lt_top _ _)
320331

332+
lemma algebra_map_exp_comm (x : 𝕂) :
333+
algebra_map 𝕂 𝔸 (exp 𝕂 𝕂 x) = exp 𝕂 𝔸 (algebra_map 𝕂 𝔸 x) :=
334+
algebra_map_exp_comm_of_mem_ball x (by simp [exp_series_radius_eq_top])
335+
321336
end any_algebra
322337

323338
section comm_algebra
@@ -362,3 +377,17 @@ lemma exp_ℝ_ℂ_eq_exp_ℂ_ℂ : exp ℝ ℂ = exp ℂ ℂ :=
362377
exp_eq_exp ℝ ℂ ℂ
363378

364379
end scalar_tower
380+
381+
lemma star_exp {𝕜 A : Type*} [is_R_or_C 𝕜] [normed_ring A] [normed_algebra 𝕜 A]
382+
[star_ring A] [normed_star_group A] [complete_space A]
383+
[star_module 𝕜 A] (a : A) : star (exp 𝕜 A a) = exp 𝕜 A (star a) :=
384+
begin
385+
rw exp_eq_tsum,
386+
have := continuous_linear_map.map_tsum
387+
(starₗᵢ 𝕜 : A ≃ₗᵢ⋆[𝕜] A).to_linear_isometry.to_continuous_linear_map
388+
(exp_series_summable' a),
389+
dsimp at this,
390+
convert this,
391+
funext,
392+
simp only [star_smul, star_pow, one_div, star_inv', star_nat_cast],
393+
end

src/analysis/normed_space/spectrum.lean

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Jireh Loreaux
55
-/
66
import algebra.algebra.spectrum
77
import analysis.special_functions.pow
8+
import analysis.special_functions.exponential
89
import analysis.complex.liouville
910
import analysis.analytic.radius_liminf
1011
/-!
@@ -346,6 +347,43 @@ begin
346347
(mem_resolvent_set_iff.mp (H₀.symm ▸ set.mem_univ 0)))),
347348
end
348349

350+
section exp_mapping
351+
352+
local notation `↑ₐ` := algebra_map 𝕜 A
353+
354+
/-- For `𝕜 = ℝ` or `𝕜 = ℂ`, `exp 𝕜 𝕜` maps the spectrum of `a` into the spectrum of `exp 𝕜 A a`. -/
355+
theorem exp_mem_exp [is_R_or_C 𝕜] [normed_ring A] [normed_algebra 𝕜 A] [complete_space A]
356+
(a : A) {z : 𝕜} (hz : z ∈ spectrum 𝕜 a) : exp 𝕜 𝕜 z ∈ spectrum 𝕜 (exp 𝕜 A a) :=
357+
begin
358+
have hexpmul : exp 𝕜 A a = exp 𝕜 A (a - ↑ₐ z) * ↑ₐ (exp 𝕜 𝕜 z),
359+
{ rw [algebra_map_exp_comm z, ←exp_add_of_commute (algebra.commutes z (a - ↑ₐz)).symm,
360+
sub_add_cancel] },
361+
let b := ∑' n : ℕ, ((1 / (n + 1).factorial) : 𝕜) • (a - ↑ₐz) ^ n,
362+
have hb : summable (λ n : ℕ, ((1 / (n + 1).factorial) : 𝕜) • (a - ↑ₐz) ^ n),
363+
{ refine summable_of_norm_bounded_eventually _ (real.summable_pow_div_factorial ∥a - ↑ₐz∥) _,
364+
filter_upwards [filter.eventually_cofinite_ne 0] with n hn,
365+
rw [norm_smul, mul_comm, norm_div, norm_one, is_R_or_C.norm_eq_abs, is_R_or_C.abs_cast_nat,
366+
←div_eq_mul_one_div],
367+
exact div_le_div (pow_nonneg (norm_nonneg _) n) (norm_pow_le' (a - ↑ₐz) (zero_lt_iff.mpr hn))
368+
(by exact_mod_cast nat.factorial_pos n)
369+
(by exact_mod_cast nat.factorial_le (lt_add_one n).le) },
370+
have h₀ : ∑' n : ℕ, ((1 / (n + 1).factorial) : 𝕜) • (a - ↑ₐz) ^ (n + 1) = (a - ↑ₐz) * b,
371+
{ simpa only [mul_smul_comm, pow_succ] using hb.tsum_mul_left (a - ↑ₐz) },
372+
have h₁ : ∑' n : ℕ, ((1 / (n + 1).factorial) : 𝕜) • (a - ↑ₐz) ^ (n + 1) = b * (a - ↑ₐz),
373+
{ simpa only [pow_succ', algebra.smul_mul_assoc] using hb.tsum_mul_right (a - ↑ₐz) },
374+
have h₃ : exp 𝕜 A (a - ↑ₐz) = 1 + (a - ↑ₐz) * b,
375+
{ rw exp_eq_tsum,
376+
convert tsum_eq_zero_add (exp_series_summable' (a - ↑ₐz)),
377+
simp only [nat.factorial_zero, nat.cast_one, _root_.div_one, pow_zero, one_smul],
378+
exact h₀.symm },
379+
rw [spectrum.mem_iff, is_unit.sub_iff, ←one_mul (↑ₐ(exp 𝕜 𝕜 z)), hexpmul, ←_root_.sub_mul,
380+
commute.is_unit_mul_iff (algebra.commutes (exp 𝕜 𝕜 z) (exp 𝕜 A (a - ↑ₐz) - 1)).symm,
381+
sub_eq_iff_eq_add'.mpr h₃, commute.is_unit_mul_iff (h₀ ▸ h₁ : (a - ↑ₐz) * b = b * (a - ↑ₐz))],
382+
exact not_and_of_not_left _ (not_and_of_not_left _ ((not_iff_not.mpr is_unit.sub_iff).mp hz)),
383+
end
384+
385+
end exp_mapping
386+
349387
end spectrum
350388

351389
namespace alg_hom
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/-
2+
Copyright (c) 2022 Jireh Loreaux. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Jireh Loreaux
5+
-/
6+
import analysis.normed_space.star.basic
7+
import algebra.star.module
8+
import analysis.special_functions.exponential
9+
10+
/-! # The exponential map from selfadjoint to unitary
11+
In this file, we establish various propreties related to the map `λ a, exp ℂ A (I • a)` between the
12+
subtypes `self_adjoint A` and `unitary A`.
13+
14+
## TODO
15+
16+
* Show that any exponential unitary is path-connected in `unitary A` to `1 : unitary A`.
17+
* Prove any unitary whose distance to `1 : unitary A` is less than `1` can be expressed as an
18+
exponential unitary.
19+
* A unitary is in the path component of `1` if and only if it is a finite product of exponential
20+
unitaries.
21+
-/
22+
23+
section star
24+
25+
variables {A : Type*}
26+
[normed_ring A] [normed_algebra ℂ A] [star_ring A] [cstar_ring A] [complete_space A]
27+
[star_module ℂ A]
28+
29+
open complex
30+
31+
lemma self_adjoint.exp_i_smul_unitary {a : A} (ha : a ∈ self_adjoint A) :
32+
exp ℂ A (I • a) ∈ unitary A :=
33+
begin
34+
rw [unitary.mem_iff, star_exp],
35+
simp only [star_smul, is_R_or_C.star_def, self_adjoint.mem_iff.mp ha, conj_I, neg_smul],
36+
rw ←@exp_add_of_commute ℂ A _ _ _ _ _ _ ((commute.refl (I • a)).neg_left),
37+
rw ←@exp_add_of_commute ℂ A _ _ _ _ _ _ ((commute.refl (I • a)).neg_right),
38+
simpa only [add_right_neg, add_left_neg, and_self] using (exp_zero : exp ℂ A 0 = 1),
39+
end
40+
41+
/-- The map from the selfadjoint real subspace to the unitary group. This map only makes sense
42+
over ℂ. -/
43+
@[simps]
44+
noncomputable def self_adjoint.exp_unitary (a : self_adjoint A) : unitary A :=
45+
⟨exp ℂ A (I • a), self_adjoint.exp_i_smul_unitary (a.property)⟩
46+
47+
open self_adjoint
48+
49+
lemma commute.exp_unitary_add {a b : self_adjoint A} (h : commute (a : A) (b : A)) :
50+
exp_unitary (a + b) = exp_unitary a * exp_unitary b :=
51+
begin
52+
ext,
53+
have hcomm : commute (I • (a : A)) (I • (b : A)),
54+
calc _ = _ : by simp only [h.eq, algebra.smul_mul_assoc, algebra.mul_smul_comm],
55+
simpa only [exp_unitary_coe, add_subgroup.coe_add, smul_add] using exp_add_of_commute hcomm,
56+
end
57+
58+
lemma commute.exp_unitary {a b : self_adjoint A} (h : commute (a : A) (b : A)) :
59+
commute (exp_unitary a) (exp_unitary b) :=
60+
calc (exp_unitary a) * (exp_unitary b) = (exp_unitary b) * (exp_unitary a)
61+
: by rw [←h.exp_unitary_add, ←h.symm.exp_unitary_add, add_comm]
62+
63+
end star

src/analysis/normed_space/star/spectrum.lean

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ Authors: Jireh Loreaux
55
-/
66
import analysis.normed_space.star.basic
77
import analysis.normed_space.spectrum
8+
import algebra.star.module
9+
import analysis.normed_space.star.exponential
810

911
/-! # Spectral properties in C⋆-algebras
1012
In this file, we establish various propreties related to the spectrum of elements in C⋆-algebras.
@@ -42,11 +44,15 @@ end unitary_spectrum
4244

4345
section complex_scalars
4446

47+
open complex
48+
4549
variables {A : Type*}
46-
[normed_ring A] [normed_algebra ℂ A] [star_ring A] [cstar_ring A] [complete_space A]
47-
[measurable_space A] [borel_space A] [topological_space.second_countable_topology A]
50+
[normed_ring A] [normed_algebra ℂ A] [complete_space A] [star_ring A] [cstar_ring A]
51+
52+
local notation `↑ₐ` := algebra_map ℂ A
4853

49-
lemma spectral_radius_eq_nnnorm_of_self_adjoint {a : A} (ha : a ∈ self_adjoint A) :
54+
lemma spectral_radius_eq_nnnorm_of_self_adjoint [measurable_space A] [borel_space A]
55+
[topological_space.second_countable_topology A] {a : A} (ha : a ∈ self_adjoint A) :
5056
spectral_radius ℂ a = ∥a∥₊ :=
5157
begin
5258
have hconst : tendsto (λ n : ℕ, (∥a∥₊ : ℝ≥0∞)) at_top _ := tendsto_const_nhds,
@@ -59,7 +65,8 @@ begin
5965
simp,
6066
end
6167

62-
lemma spectral_radius_eq_nnnorm_of_star_normal (a : A) [is_star_normal a] :
68+
lemma spectral_radius_eq_nnnorm_of_star_normal [topological_space.second_countable_topology A]
69+
[measurable_space A] [borel_space A] (a : A) [is_star_normal a] :
6370
spectral_radius ℂ a = ∥a∥₊ :=
6471
begin
6572
refine (ennreal.pow_strict_mono (by linarith : 20)).injective _,
@@ -77,4 +84,35 @@ begin
7784
rw [spectral_radius_eq_nnnorm_of_self_adjoint ha, sq, nnnorm_star_mul_self, coe_mul],
7885
end
7986

87+
/-- Any element of the spectrum of a selfadjoint is real. -/
88+
theorem self_adjoint.mem_spectrum_eq_re [star_module ℂ A] [nontrivial A] {a : A}
89+
(ha : a ∈ self_adjoint A) {z : ℂ} (hz : z ∈ spectrum ℂ a) : z = z.re :=
90+
begin
91+
let Iu := units.mk0 I I_ne_zero,
92+
have : exp ℂ ℂ (I • z) ∈ spectrum ℂ (exp ℂ A (I • a)),
93+
by simpa only [units.smul_def, units.coe_mk0]
94+
using spectrum.exp_mem_exp (Iu • a) (smul_mem_smul_iff.mpr hz),
95+
exact complex.ext (of_real_re _)
96+
(by simpa only [←complex.exp_eq_exp_ℂ_ℂ, mem_sphere_zero_iff_norm, norm_eq_abs, abs_exp,
97+
real.exp_eq_one_iff, smul_eq_mul, I_mul, neg_eq_zero]
98+
using spectrum.subset_circle_of_unitary (self_adjoint.exp_i_smul_unitary ha) this),
99+
end
100+
101+
/-- Any element of the spectrum of a selfadjoint is real. -/
102+
theorem self_adjoint.mem_spectrum_eq_re' [star_module ℂ A] [nontrivial A]
103+
(a : self_adjoint A) {z : ℂ} (hz : z ∈ spectrum ℂ (a : A)) : z = z.re :=
104+
self_adjoint.mem_spectrum_eq_re a.property hz
105+
106+
/-- The spectrum of a selfadjoint is real -/
107+
theorem self_adjoint.coe_re_map_spectrum [star_module ℂ A] [nontrivial A] {a : A}
108+
(ha : a ∈ self_adjoint A) : spectrum ℂ a = (coe ∘ re '' (spectrum ℂ a) : set ℂ) :=
109+
le_antisymm (λ z hz, ⟨z, hz, (self_adjoint.mem_spectrum_eq_re ha hz).symm⟩) (λ z, by
110+
{ rintros ⟨z, hz, rfl⟩,
111+
simpa only [(self_adjoint.mem_spectrum_eq_re ha hz).symm, function.comp_app] using hz })
112+
113+
/-- The spectrum of a selfadjoint is real -/
114+
theorem self_adjoint.coe_re_map_spectrum' [star_module ℂ A] [nontrivial A] (a : self_adjoint A) :
115+
spectrum ℂ (a : A) = (coe ∘ re '' (spectrum ℂ (a : A)) : set ℂ) :=
116+
self_adjoint.coe_re_map_spectrum a.property
117+
80118
end complex_scalars

0 commit comments

Comments
 (0)