Skip to content

Commit 5eac2b3

Browse files
committed
wip
1 parent 0e3a4d9 commit 5eac2b3

3 files changed

Lines changed: 138 additions & 33 deletions

File tree

Mathlib/Algebra/Module/LinearMap/End.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ theorem id_pow (n : ℕ) : (id : End R M) ^ n = .id :=
149149
variable {f' : End R M}
150150

151151
theorem iterate_succ (n : ℕ) : f' ^ (n + 1) = .comp (f' ^ n) f' := by rw [pow_succ, mul_eq_comp]
152+
theorem iterate_succ' (n : ℕ) : f' ^ (n + 1) = .comp f' (f' ^ n) := by rw [pow_succ', mul_eq_comp]
152153

153154
theorem iterate_surjective (h : Surjective f') : ∀ n : ℕ, Surjective (f' ^ n)
154155
| 0 => surjective_id

Mathlib/Algebra/Module/Submodule/Range.lean

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -145,13 +145,11 @@ end
145145
@[simps]
146146
def iterateRange (f : M →ₗ[R] M) : ℕ →o (Submodule R M)ᵒᵈ where
147147
toFun n := LinearMap.range (f ^ n)
148-
monotone' n m w x h := by
149-
obtain ⟨c, rfl⟩ := Nat.exists_eq_add_of_le w
150-
rw [LinearMap.mem_range] at h
151-
obtain ⟨m, rfl⟩ := h
152-
rw [LinearMap.mem_range]
153-
use (f ^ c) m
154-
rw [pow_add, Module.End.mul_apply]
148+
monotone' := monotone_nat_of_le_succ fun | n, _, ⟨x, rfl⟩ => ⟨f x, rfl⟩
149+
150+
lemma iterateRange_succ {f : M →ₗ[R] M} {n : ℕ} :
151+
iterateRange f (n + 1) = (iterateRange f n).map f := by
152+
simp only [iterateRange_coe, range_eq_map, ← map_comp, Module.End.iterate_succ']
155153

156154
/-- Restrict the codomain of a linear map `f` to `f.range`.
157155
Lines changed: 132 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,64 @@
1-
import Mathlib
1+
/-
2+
Copyright (c) 2026 Bhavik Mehta. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Bhavik Mehta
5+
-/
6+
import Mathlib.Algebra.Order.Ring.Star
7+
import Mathlib.Analysis.Normed.Module.RCLike.Basic
8+
import Mathlib.Analysis.Normed.Module.RieszLemma
9+
import Mathlib.Analysis.Normed.Operator.Banach
10+
import Mathlib.Analysis.Normed.Operator.BoundedLinearMaps
11+
import Mathlib.Analysis.Normed.Operator.Compact
12+
import Mathlib.LinearAlgebra.Eigenspace.Basic
13+
14+
/-!
15+
# Spectral theory of compact operators
16+
17+
This file develops the spectral theory of compact operators on Banach spaces.
18+
The main result is the Fredholm alternative for compact operators.
19+
20+
## Main results
21+
22+
* `antilipschitz_of_not_hasEigenvalue`: if `T` is a compact operator and `μ ≠ 0` is not an
23+
eigenvalue, then `T - μI` is antilipschitz.
24+
* `fredholm_alternative`: the Fredholm alternative for compact operators.
25+
-/
226

327
-- let X be a Banach space
4-
variable {X : Type*} [NormedAddCommGroup X] [NormedSpace X]
28+
variable {𝕜 X : Type*} [RCLike 𝕜] [NormedAddCommGroup X] [NormedSpace 𝕜 X]
529
-- and T be a compact operator on it
6-
variable {T : X →L[] X} (hT : IsCompactOperator T)
30+
variable {T : X →L[𝕜] X}
731

8-
open Module.End
32+
open Module End
33+
34+
/-- If a continuous linear map `f` satisfies `‖x‖ = 1 → 1 ≤ K * ‖f x‖`, then `f` is
35+
antilipschitz with constant `K`. -/
36+
lemma ContinuousLinearMap.antilipschitz_of_bound_of_norm_one {X Y : Type*}
37+
[NormedAddCommGroup X] [NormedSpace 𝕜 X] [NormedAddCommGroup Y] [NormedSpace 𝕜 Y]
38+
(f : X →L[𝕜] Y) {K : NNReal} (h : ∀ x, ‖x‖ = 11 ≤ K * ‖f x‖) :
39+
AntilipschitzWith K f :=
40+
ContinuousLinearMap.antilipschitz_of_bound _ fun x ↦ by
41+
obtain rfl | hx := eq_or_ne x 0
42+
· simp
43+
simpa [norm_smul, field] using h ((‖x‖⁻¹ : 𝕜) • x) (norm_smul_inv_norm hx)
944

1045
open Filter Topology in
11-
theorem far_away {μ : ℂ} (hμ : μ ≠ 0) (hT : IsCompactOperator T)
12-
(h : ¬ HasEigenvalue (T : X →ₗ[ℂ] X) μ) :
13-
∃ c > 0, ∀ x, c * ‖x‖ ≤ ‖(T - μ • 1) x‖ := by
14-
-- By homogeneity, it suffices to establish the claim for unit vectors x.
46+
/-- If `T : X →L[𝕜] X` is a compact operator on a Banach space `X`, and `μ ≠ 0` is not an
47+
eigenvalue of `T`, then `T - μ • 1` is antilipschitz.
48+
49+
This is a useful step in the proof of the Fredholm alternative. -/
50+
theorem antilipschitz_of_not_hasEigenvalue (hT : IsCompactOperator T)
51+
{μ : 𝕜} (hμ : μ ≠ 0) (h : ¬ HasEigenvalue (T : End 𝕜 X) μ) :
52+
∃ K > 0, AntilipschitzWith K (T - μ • 1 : X →L[𝕜] X) := by
1553
suffices ∃ c > 0, ∀ x, ‖x‖ = 1 → c ≤ ‖(T - μ • 1) x‖ by
1654
obtain ⟨c, hc', hc⟩ := this
17-
refine ⟨c, hc', fun x ↦ ?_⟩
18-
obtain h | h := eq_or_ne x 0
19-
· simp [h]
20-
simpa [norm_smul, le_inv_mul_iff₀', norm_pos_iff, h] using hc _ (norm_smul_inv_norm (𝕜 := ℂ) h)
55+
refine ⟨c.toNNReal⁻¹, by positivity, ?_⟩
56+
apply ContinuousLinearMap.antilipschitz_of_bound_of_norm_one
57+
simpa [NNReal.coe_inv, le_inv_mul_iff₀', hc'] using hc
2158
-- Suppose not, then we can find a sequence of unit vectors xₙ such that (T - μ • 1) xₙ → 0.
2259
by_contra!
2360
obtain ⟨φ, hφ_anti, hφ_pos, hφ⟩ := exists_seq_strictAnti_tendsto (0 : ℝ)
24-
have : ∀ n, ∃ x, ‖x‖ = 1 ∧ ‖(T - μ • 1) x‖ < φ n := by
25-
intro n
26-
exact this (φ n) (hφ_pos n)
61+
have (n : ℕ) : ∃ x, ‖x‖ = 1 ∧ ‖(T - μ • 1) x‖ < φ n := this (φ n) (hφ_pos n)
2762
choose x hx_norm hx_bound using this
2863
have hx_lim : Tendsto (fun n ↦ (T - μ • 1) (x n)) atTop (𝓝 0) := squeeze_zero_norm (by grind) hφ
2964
-- Define the sequence of vectors yₙ := T xₙ
@@ -39,14 +74,14 @@ theorem far_away {μ : ℂ} (hμ : μ ≠ 0) (hT : IsCompactOperator T)
3974
-- since T is, so we can extract a convergent subsequence, and say y_ (ψ n) → y.
4075
obtain ⟨K, hK, hK'⟩ := hT.image_closedBall_subset_compact 1
4176
obtain ⟨y, hyK, ψ, hψ, hψy⟩ := hK.tendsto_subseq (x := y_) (fun n ↦ hK' ⟨x n, by simp [*], rfl⟩)
42-
-- However (T - μ) yₙ = T (T - μ • 1) xₙ → 0
77+
-- However (T - μ • 1) yₙ = T ((T - μ • 1) xₙ) → 0
4378
have hy_lim : Tendsto (fun n ↦ (T - μ • 1) (y_ n)) atTop (nhds 0) := by
4479
have : Tendsto (fun n ↦ _) _ _ := T.continuous.continuousAt.tendsto.comp hx_lim
4580
simpa using this
46-
-- so (T - μ) y = 0.
81+
-- so (T - μ • 1) y = 0.
4782
have hy_eigen' : (T - μ • 1) y = 0 := by
4883
apply tendsto_nhds_unique _ (hy_lim.comp hψ.tendsto_atTop)
49-
have : Continuous (T - μ • 1 : X →L[] X) := by fun_prop
84+
have : Continuous (T - μ • 1 : X →L[𝕜] X) := by fun_prop
5085
exact this.continuousAt.tendsto.comp hψy
5186
-- Since yₙ are bounded away from 0, we must have y ≠ 0.
5287
have hy_ne : y ≠ 0 := by
@@ -56,24 +91,95 @@ theorem far_away {μ : ℂ} (hμ : μ ≠ 0) (hT : IsCompactOperator T)
5691
specialize hψy (‖μ‖ / 2) (by positivity)
5792
filter_upwards [hψ.tendsto_atTop.eventually hy_lower, hψy] using by grind
5893
-- So y is an eigenvector of T with eigenvalue μ,
59-
have : HasEigenvector (T : X →ₗ[ℂ] X) μ y := by
60-
rw [hasEigenvector_iff]
61-
rw [mem_genEigenspace_one]
62-
simpa [hy_ne, sub_eq_zero] using hy_eigen'
94+
have : HasEigenvector (T : End 𝕜 X) μ y := by
95+
simpa [hasEigenvector_iff, mem_genEigenspace_one, hy_ne, sub_eq_zero] using hy_eigen'
6396
-- which is a contradiction.
6497
exact h (hasEigenvalue_of_hasEigenvector this)
6598

66-
theorem fredholm_alternative [CompleteSpace X] {μ : ℂ} (hμ : μ ≠ 0) :
67-
HasEigenvalue (T : X →ₗ[ℂ] X) μ ∨ μ ∈ resolventSet ℂ T := by
99+
/-- A variation of Riesz's lemma where we get a vector `x₀` of norm exactly 1. -/
100+
theorem riesz_lemma_one
101+
{𝕜 : Type*} [RCLike 𝕜] {E : Type*} [NormedAddCommGroup E] [NormedSpace 𝕜 E]
102+
{F : Subspace 𝕜 E} (hFc : IsClosed (F : Set E)) (hF : ∃ (x : E), x ∉ F) {r : ℝ} (hr : r < 1) :
103+
∃ x₀ ∉ F, ‖x₀‖ = 1 ∧ ∀ y ∈ F, r ≤ ‖x₀ - y‖ := by
104+
obtain ⟨x₀, hx₀, h⟩ := riesz_lemma hFc hF hr
105+
have hx₀' : x₀ ≠ 0 := by rintro rfl; simp at hx₀
106+
refine ⟨(‖x₀‖⁻¹ : 𝕜) • x₀, ?_, norm_smul_inv_norm hx₀', ?_⟩
107+
· rwa [Submodule.smul_mem_iff]
108+
simpa
109+
intro y hy
110+
have h₂ : ‖(‖x₀‖ : 𝕜)⁻¹ • (x₀ - (‖x₀‖ : 𝕜) • y)‖ = ‖x₀‖⁻¹ * ‖x₀ - (‖x₀‖ : 𝕜) • y‖ := by
111+
rw [norm_smul, norm_inv, norm_algebraMap', norm_norm]
112+
have h₁ := h ((‖x₀‖ : 𝕜) • y) (F.smul_mem _ hy)
113+
rwa [← le_inv_mul_iff₀' (by simpa), ← h₂, smul_sub, inv_smul_smul₀] at h₁
114+
simpa using hx₀'
115+
116+
-- theorem riesz_lemma_of_norm_lt {c : 𝕜} (hc : 1 < ‖c‖) {R : ℝ} (hR : ‖c‖ < R) {F : Subspace 𝕜 E}
117+
-- (hFc : IsClosed (F : Set E)) (hF : ∃ x : E, x ∉ F) :
118+
-- ∃ x₀ : E, ‖x₀‖ ≤ R ∧ ∀ y ∈ F, 1 ≤ ‖x₀ - y‖ := by
119+
120+
theorem thing {𝕜 X : Type*} [RCLike 𝕜] [NormedAddCommGroup X] [NormedSpace 𝕜 X]
121+
{S : X →L[𝕜] X}
122+
(hS_not_surj : ¬ (S : X → X).Surjective)
123+
(hS_inj : (S : X → X).Injective)
124+
(hT_anti : Topology.IsClosedEmbedding S) :
125+
∃ f : ℕ → X, (∀ n, ‖f n‖ = 1) ∧ Pairwise (2⁻¹ ≤ ‖f · - f ·‖) := by
126+
obtain ⟨x, hx⟩ : ∃ x : X, ∀ y, S y ≠ x := by simpa [Function.Surjective] using hS_not_surj
127+
let V (n : ℕ) : Submodule 𝕜 X := S.iterateRange n
128+
have hV_succ (n : ℕ) : V (n + 1) = (V n).map (S : End 𝕜 X) := LinearMap.iterateRange_succ
129+
have hV_closed (n : ℕ) : IsClosed (V n : Set X) := by
130+
induction n with
131+
| zero => simp [V, Module.End.one_eq_id]
132+
| succ n ih =>
133+
rw [hV_succ]
134+
apply hT_anti.isClosedMap _ ih
135+
have x (n : ℕ) : ∃ x ∈ V n, ‖x‖ = 1 ∧ ∀ y ∈ V (n + 1), 2⁻¹ ≤ ‖x - y‖ := by
136+
have h₁ : IsClosed (Submodule.comap (V n).subtype (V (n + 1)) : Set (V n)) := by
137+
simpa using (hV_closed (n + 1)).preimage_val
138+
have h₂ : ∃ x : V n, x ∉ (V (n + 1)).comap (V n).subtype := by
139+
suffices ∃ a, ∀ y, S y ≠ a by simpa [iterate_succ, V, (iterate_injective hS_inj n).eq_iff]
140+
use x
141+
obtain ⟨⟨x, hx⟩, hx', hxn, hxy⟩ := riesz_lemma_one h₁ h₂ (show 2⁻¹ < 1 by norm_num)
142+
simp only [Submodule.mem_comap, Submodule.subtype_apply, AddSubgroupClass.coe_norm,
143+
AddSubgroupClass.coe_sub, Subtype.forall] at hx' hxn hxy
144+
exact ⟨x, hx, hxn, fun y hy ↦ hxy y (S.iterateRange.monotone (by simp) hy) hy⟩
145+
choose x hxv hxn hxy using x
146+
refine ⟨x, hxn, ?_⟩
147+
intro m n hmn
148+
wlog! hmn' : m < n generalizing m n
149+
· rw [norm_sub_rev]
150+
exact this hmn.symm (by order)
151+
exact hxy m (x n) (S.iterateRange.monotone hmn' (hxv n))
152+
153+
/-- The Fredholm alternative for compact operators: if `T` is a compact operator and `μ ≠ 0`,
154+
then either `μ` is an eigenvalue of `T`, or `μ` is in the resolvent set of `T`. -/
155+
theorem fredholm_alternative [CompleteSpace X] (hT : IsCompactOperator T)
156+
{μ : 𝕜} (hμ : μ ≠ 0) :
157+
HasEigenvalue (T : End 𝕜 X) μ ∨ μ ∈ resolventSet 𝕜 T := by
68158
by_contra!
69159
obtain ⟨h₁, h₂⟩ := this
70-
let S := (T - μ • 1)
160+
let (eq := hS) S := (T - μ • 1)
71161
replace h₂ : ¬ (S : X → X).Bijective := by
72162
rw [spectrum.mem_resolventSet_iff, ← IsUnit.neg_iff,
73163
ContinuousLinearMap.isUnit_iff_bijective] at h₂
74164
convert h₂
75165
ext x
76166
simp [S]
77-
have : (S : X → X).Injective := by
167+
obtain ⟨K, -, hK : AntilipschitzWith K S⟩ := antilipschitz_of_not_hasEigenvalue hT hμ h₁
168+
obtain ⟨f, hf_norm, hf_pair⟩ := thing (mt (.intro hK.injective) h₂) hK.injective
169+
(hK.isClosedEmbedding S.uniformContinuous)
170+
have : Pairwise fun x₁ x₂ ↦ 2⁻¹ * K ≤ ‖T (f x₁) - T (f x₂)‖ := by
171+
intro m n hmn
172+
have := hK.le_mul_dist (f m) (f n)
173+
simp [dist_eq_norm_sub] at this
78174
sorry
79175
sorry
176+
177+
178+
-- have S_inj : (S : X → X).Injective := by
179+
-- rw [hasEigenvalue_iff, eigenspace_def, not_not, LinearMap.ker_eq_bot] at h₁
180+
-- exact h₁
181+
-- let V (n : ℕ) : Submodule ℂ X := (S ^ n).range
182+
183+
-- sorry
184+
185+
-- #min_imports

0 commit comments

Comments
 (0)