← Verification

.lake/packages/mathlib/Mathlib/Analysis/Normed/Module/Bases.lean

Download original source

Read-only source copy. Line numbers are navigation aids.

1/-
2Copyright (c) 2025 Michał Świętek. All rights reserved.
3Released under Apache 2.0 license as described in the file LICENSE.
4Authors: Michał Świętek
5-/
6module
7
8public import Mathlib.Analysis.Normed.Group.InfiniteSum
9public import Mathlib.Analysis.Normed.Operator.BanachSteinhaus
10public import Mathlib.LinearAlgebra.FiniteDimensional.Lemmas
11public import Mathlib.Algebra.Order.Field.Power
12public import Mathlib.Data.Nat.Totient
13public import Mathlib.Data.Sym.Sym2
14public import Mathlib.LinearAlgebra.FreeModule.StrongRankCondition
15public import Mathlib.RingTheory.LocalRing.Basic
16public import Mathlib.Tactic.NormNum.GCD
17
18/-!
19# Schauder Bases and Generalized Bases
20
21This file defines the theory of bases in Banach spaces, unifying the classical
22sequential notion with modern generalized bases.
23
24## Overview
25
26A **basis** in a normed space allows every vector to be expanded as a (potentially infinite) linear
27combination of basis vectors. Historically, this was defined strictly for sequences with convergence
28of partial sums (the "classical Schauder basis").
29
30However, modern functional analysis requires bases indexed by arbitrary sets
31`β` (e.g., for non-separable spaces or Hilbert spaces), where convergence
32is defined via nets over finite subsets (unconditional convergence).
33
34This file provides a unified structure `GeneralSchauderBasis` that captures both:
35* **Classical Schauder Bases:** Indexed by `ℕ`, using `SummationFilter.conditional`
36 to enforce sequential convergence of partial sums.
37* **Unconditional/Extended Bases:** Indexed by an arbitrary type `β`, using
38 `SummationFilter.unconditional` to enforce convergence of the net of all finite subsets.
39
40## Main Definitions
41
42* `GeneralSchauderBasis β 𝕜 X L`: A structure representing a generalized Schauder basis for a
43 normed space `X` over a field `𝕜`, indexed by a type `β` with a `SummationFilter L`.
44* `SchauderBasis 𝕜 X`: The classical Schauder basis, an abbreviation for
45 `GeneralSchauderBasis ℕ 𝕜 X (SummationFilter.conditional ℕ)`.
46* `UnconditionalSchauderBasis β 𝕜 X`: An unconditional Schauder basis, an abbreviation for
47 `GeneralSchauderBasis β 𝕜 X (SummationFilter.unconditional β)`.
48* `GeneralSchauderBasis.proj b A`: The projection onto a finite set `A` of basis vectors,
49 mapping `x ↦ ∑ i ∈ A, b.coord i x • b i`.
50* `SchauderBasis.proj b n`: The `n`-th projection `X → X`,
51 mapping `x ↦ ∑ i ∈ Finset.range n, b.coord i x • b i`.
52* `UnconditionalSchauderBasis.enormProjBound`: The supremum of projection norms (`ℝ≥0∞`).
53* `UnconditionalSchauderBasis.nnnormProjBound`: The supremum of projection norms (`ℝ≥0`),
54 requires `[CompleteSpace X]`.
55* `RankOneDecomposition 𝕜 X`: Data for constructing a Schauder basis from
56 a sequence of finite-rank projections whose differences are rank one.
57* `RankOneDecomposition.basis`: Constructs a `SchauderBasis` from a `RankOneDecomposition`.
58
59## Main Results
60
61* `GeneralSchauderBasis.linearIndependent`: A Schauder basis is linearly independent.
62* `GeneralSchauderBasis.tendsto_proj`: The projections `proj A` converge to identity
63 along the summation filter.
64* `GeneralSchauderBasis.range_proj_eq_span`: The range of `proj A` is the span of the basis
65 elements in `A`.
66* `GeneralSchauderBasis.proj_comp`: Composition of projections satisfies
67 `proj A (proj B x) = proj (A ∩ B) x`.
68* `SchauderBasis.exists_norm_proj_le`: In a Banach space, the projections are uniformly bounded.
69* `UnconditionalSchauderBasis.exists_norm_proj_le`: For unconditional bases, projections
70 onto all finite sets are uniformly bounded.
71
72## References
73
74* [Albiac, Fernando. and Kalton, Nigel J., Topics in Banach Space Theory][Albiac_Kalton_2016].
75* [Singer, Ivan, Bases in Banach spaces][Singer_1970].
76* [Marti, Jürg T., Introduction to the theory of bases][MartiJurg1969].
77
78-/
79
80@[expose] public section
81
82noncomputable section
83
84open Filter LinearMap Set ENNReal NNReal
85
86open scoped Topology
87
88variable {𝕜 : Type*} [NontriviallyNormedField 𝕜]
89variable {X : Type*} [NormedAddCommGroup X] [NormedSpace 𝕜 X]
90
91open scoped Classical in
92/--
93A generalized Schauder basis indexed by `β` with summation along filter `L`.
94
95The key fields are:
96* `basis`: The basis vectors `e i` for `i : β`
97* `coord`: The coordinate functionals `f i` for `i : β` in the dual space
98* `ortho`: Biorthogonality condition `f i (e j) = if i = j then 1 else 0`
99* `expansion`: Every `x` equals `∑ i, f i x • e i`, converging along `L`
100
101See `SchauderBasis` for the classical `ℕ`-indexed case with conditional convergence,
102and `UnconditionalSchauderBasis` for the unconditional case.
103-/
104@[ext]
105structure GeneralSchauderBasis (β : Type*) (𝕜 : Type*)
106 (X : Type*) [NontriviallyNormedField 𝕜] [NormedAddCommGroup X] [NormedSpace 𝕜 X]
107 (L : SummationFilter β) where
108 /-- The basis vectors. -/
109 basis : β → X
110 /-- Coordinate functionals. -/
111 coord : β → StrongDual 𝕜 X
112 /-- Biorthogonality. -/
113 ortho (i j : β) : coord i (basis j) = (Pi.single j (1 : 𝕜) : β → 𝕜) i
114 /-- The sum converges to `x` along the provided `SummationFilter L`. -/
115 expansion (x : X) : HasSum (fun i ↦ (coord i) x • basis i) x L
116
117variable {β : Type*}
118variable {L : SummationFilter β}
119
120/-- A classical Schauder basis indexed by `ℕ` with conditional convergence. -/
121abbrev SchauderBasis (𝕜 : Type*) (X : Type*) [NontriviallyNormedField 𝕜]
122 [NormedAddCommGroup X] [NormedSpace 𝕜 X] :=
123 GeneralSchauderBasis ℕ 𝕜 X (SummationFilter.conditional ℕ)
124
125/--
126An unconditional Schauder basis indexed by `β`.
127
128In the literature, this is known as:
129* An **Extended Basis** [Marti, Jürg T., Introduction to the theory of bases][MartiJurg1969]:
130Defined via convergence of the net of finite partial sums.
131* An **Unconditional Basis** [Singer, Ivan., Bases in Banach spaces][Singer_1970]: On an arbitrary
132set, convergence is necessarily unconditional.
133
134This structure generalizes the classical Schauder basis by replacing sequential
135convergence with summability over the directed set of finite subsets.
136-/
137abbrev UnconditionalSchauderBasis (β : Type*)
138 (𝕜 : Type*) (X : Type*) [NontriviallyNormedField 𝕜] [NormedAddCommGroup X] [NormedSpace 𝕜 X] :=
139 GeneralSchauderBasis β 𝕜 X (SummationFilter.unconditional β)
140
141/-- Coercion from a `GeneralSchauderBasis` to the underlying basis function. -/
142instance : CoeFun (GeneralSchauderBasis β 𝕜 X L) (fun _ ↦ β → X) where
143 coe b := b.basis
144attribute [coe] GeneralSchauderBasis.basis
145namespace GeneralSchauderBasis
146
147variable (b : GeneralSchauderBasis β 𝕜 X L)
148
149/-- The basis vectors are linearly independent. -/
150theorem linearIndependent : LinearIndependent 𝕜 b := by
151 classical
152 refine linearIndependent_iff.mpr (fun l hl ↦ l.ext ?_)
153 simpa [l.linearCombination_apply, Finsupp.sum, b.ortho, Pi.single_apply] using
154 fun i ↦ congr_arg (b.coord i) hl
155
156/-- Projection onto a finite set of basis vectors. -/
157def proj (A : Finset β) : X →L[𝕜] X := ∑ i ∈ A, (b.coord i).smulRight (b i)
158
159/-- The projection on the empty set is the zero map. -/
160@[simp]
161theorem proj_empty : b.proj ∅ = 0 := by simp [proj]
162
163/-- The action of the projection on a vector `x`. -/
164@[simp]
165theorem proj_apply (A : Finset β) (x : X) : b.proj A x = ∑ i ∈ A, b.coord i x • b i := by
166 simp [proj, _root_.sum_apply, ContinuousLinearMap.smulRight_apply]
167
168open scoped Classical in
169/-- The action of the projection on a basis element `e i`. -/
170theorem proj_apply_basis_mem (A : Finset β) (i : β) :
171 b.proj A (b i) = if i ∈ A then b i else 0 := by
172 simp [b.ortho, Pi.single_apply]
173
174/-- The projections `b.proj A x` converge to `x` along the summation filter. -/
175theorem tendsto_proj (x : X) : Tendsto (fun A ↦ b.proj A x) L.filter (𝓝 x) := by
176 simpa using! b.expansion x
177
178/-- The range of the projection is the span of the basis elements in `A`. -/
179theorem range_proj_eq_span (A : Finset β) :
180 (b.proj A).toLinearMap.range = Submodule.span 𝕜 (b '' A) := by
181 apply le_antisymm
182 · rintro _ ⟨x, rfl⟩
183 rw [ContinuousLinearMap.coe_coe, proj_apply]
184 exact Submodule.sum_mem _ fun i hi ↦
185 Submodule.smul_mem _ _ (Submodule.subset_span ⟨i, hi, rfl⟩)
186 · rw [Submodule.span_le]
187 rintro _ ⟨i, hi, rfl⟩
188 use b i
189 rw [ContinuousLinearMap.coe_coe, proj_apply_basis_mem, ite_eq_left (Finset.mem_coe.mp hi)]
190
191open scoped Classical in
192/-- Composition of projections: `proj A (proj B x) = proj (A ∩ B) x`. -/
193theorem proj_comp (A B : Finset β) (x : X) : b.proj A (b.proj B x) = b.proj (A ∩ B) x := by
194 simp only [proj_apply, map_sum, map_smul, b.ortho, Pi.single_apply, ite_smul, one_smul, zero_smul,
195 Finset.sum_ite_eq', smul_ite, smul_zero, Finset.sum_ite_mem]
196 congr 1
197 ext _
198 simp [and_comm]
199
200/-- The dimension of the range of the projection `proj A` equals the cardinality of `A`. -/
201theorem finrank_range_proj (A : Finset β) :
202 Module.finrank 𝕜 (b.proj A).toLinearMap.range = A.card := by
203 rw [range_proj_eq_span, Set.image_eq_range, finrank_span_eq_card]
204 · exact Fintype.card_coe A
205 · exact b.linearIndependent.comp (fun i : A ↦ i.val) Subtype.val_injective
206
207end GeneralSchauderBasis
208
209/-! ### Unconditional Schauder bases -/
210
211namespace UnconditionalSchauderBasis
212
213variable (b : UnconditionalSchauderBasis β 𝕜 X)
214
215/-- The basis constant for unconditional bases (supremum over all finite sets) as `enorm`. -/
216noncomputable def enormProjBound : ℝ≥0∞ := ⨆ A : Finset β, ‖b.proj A‖ₑ
217
218/-- The `enorm` of any projection is bounded by the basis constant. -/
219theorem enorm_proj_le_enormProjBound (A : Finset β) : ‖b.proj A‖ₑ ≤ b.enormProjBound :=
220 le_iSup (fun A ↦ ‖b.proj A‖ₑ) A
221
222/-- Projections are uniformly bounded for unconditional bases. -/
223theorem exists_norm_proj_le [CompleteSpace X] : ∃ C : ℝ, ∀ A : Finset β, ‖b.proj A‖ ≤ C := by
224 classical
225 apply banach_steinhaus
226 intro x
227 obtain ⟨A₀, hA₀⟩ := summable_iff_vanishing_norm.mp (b.expansion x).summable 1 zero_lt_one
228 use (A₀.powerset.image fun B ↦ ‖b.proj B x‖).sup' ((Finset.powerset_nonempty A₀).image _) id + 1
229 intro A
230 have hdecomp : b.proj A x = b.proj (A ∩ A₀) x + b.proj (A \ A₀) x := by
231 simp only [GeneralSchauderBasis.proj_apply]
232 rw [← Finset.sum_union (Finset.disjoint_sdiff_inter A A₀).symm,
233 Finset.union_comm, Finset.sdiff_union_inter]
234 rw [hdecomp]
235 -- -- The projection on the tail (A \ A₀) at `x` is bounded by 1
236 have htail : ‖b.proj (A \ A₀) x‖ < 1 := by
237 rw [GeneralSchauderBasis.proj_apply]
238 exact hA₀ (A \ A₀) Finset.sdiff_disjoint
239 apply (norm_add_le _ _).trans (add_le_add _ htail.le)
240 -- The projection on (A ∩ A₀) at `x` is bounded by the `sup'`.
241 exact Finset.le_sup' id <| Finset.mem_image_of_mem (fun B ↦ ‖b.proj B x‖)
242 (Finset.mem_powerset.2 Finset.inter_subset_right)
243
244/-- The basis constant for unconditional bases (supremum over all finite sets) as `nnnorm`.
245 It requires completeness to guarantee that the supremum is finite,
246 see lemma `bddAbove_range_nnnorm_proj` below. -/
247noncomputable def nnnormProjBound : ℝ≥0 := ⨆ A : Finset β, ‖b.proj A‖₊
248
249/-- The projection norms are bounded above in a complete space. -/
250theorem bddAbove_range_nnnorm_proj [CompleteSpace X] :
251 BddAbove (Set.range (fun A : Finset β ↦ ‖b.proj A‖₊)) := by
252 obtain ⟨C, hC⟩ := b.exists_norm_proj_le
253 have hCpos : 0 ≤ C := by simpa [GeneralSchauderBasis.proj_empty] using hC ∅
254 refine ⟨C.toNNReal, ?_⟩
255 rintro _ ⟨A, rfl⟩
256 rw [← NNReal.coe_le_coe, Real.coe_toNNReal C hCpos, coe_nnnorm]
257 exact hC A
258
259/-- The `nnnorm` of any projection is bounded by the basis constant. -/
260theorem nnnorm_proj_le_nnnormProjBound [CompleteSpace X] (A : Finset β) :
261 ‖b.proj A‖₊ ≤ b.nnnormProjBound :=
262 le_ciSup (bddAbove_range_nnnorm_proj b) A
263
264/-- The norm of any projection is bounded by the basis constant. -/
265theorem norm_proj_le_nnnormProjBound [CompleteSpace X] (A : Finset β) :
266 ‖b.proj A‖ ≤ b.nnnormProjBound :=
267 mod_cast b.nnnorm_proj_le_nnnormProjBound A
268
269end UnconditionalSchauderBasis
270
271/-! ### ℕ-indexed Schauder bases with conditional convergence -/
272
273namespace SchauderBasis
274
275variable (b : SchauderBasis 𝕜 X)
276
277/-- The `n`-th projection `P_n = b.proj (Finset.range n)`, given by:
278 `P_n x = ∑ i ∈ Finset.range n, b.coord i x • b i` -/
279def proj (n : ℕ) : X →L[𝕜] X := GeneralSchauderBasis.proj b (Finset.range n)
280
281/-- The projection at `0` is the zero map. -/
282@[simp]
283theorem proj_zero : b.proj 0 = 0 := by rw [proj, Finset.range_zero, GeneralSchauderBasis.proj_empty]
284
285/-- The action of the projection on a vector. -/
286@[simp]
287theorem proj_apply (n : ℕ) (x : X) : b.proj n x = ∑ i ∈ Finset.range n, b.coord i x • b i := by
288 rw [proj, GeneralSchauderBasis.proj_apply]
289
290/-- The action of the projection on a basis element `e i`. -/
291theorem proj_apply_basis_mem (n i : ℕ) : b.proj n (b i) = if i < n then b i else 0 := by
292 rw [proj, GeneralSchauderBasis.proj_apply_basis_mem]
293 simp
294
295/-- The range of the projection is the span of the first `n` basis elements. -/
296theorem range_proj_eq_span (n : ℕ) :
297 (b.proj n).toLinearMap.range = Submodule.span 𝕜 (b '' ↑(Finset.range n)) := by
298 rw [proj, GeneralSchauderBasis.range_proj_eq_span]
299
300/-- The dimension of the range of the projection `P n` is `n`. -/
301theorem finrank_range_proj (n : ℕ) :
302 Module.finrank 𝕜 (b.proj n).toLinearMap.range = n := by
303 rw [proj, GeneralSchauderBasis.finrank_range_proj, Finset.card_range]
304
305/-- The projections converge pointwise to the identity map. -/
306theorem tendsto_proj (x : X) : Tendsto (fun n ↦ b.proj n x) atTop (𝓝 x) := by
307 have := GeneralSchauderBasis.tendsto_proj b x
308 rwa [SummationFilter.conditional_filter_eq_map_range] at this
309
310/-- Composition of projections: `proj n (proj m x) = proj (min n m) x`. -/
311theorem proj_comp (n m : ℕ) (x : X) : b.proj n (b.proj m x) = b.proj (min n m) x := by
312 simp only [proj, GeneralSchauderBasis.proj_comp]
313 congr 2
314 ext _
315 simp only [Finset.mem_inter, Finset.mem_range]
316 omega
317
318/-- The projections are uniformly bounded. -/
319theorem exists_norm_proj_le [CompleteSpace X] : ∃ C : ℝ, ∀ n : ℕ, ‖b.proj n‖ ≤ C := by
320 apply banach_steinhaus
321 intro x
322 obtain ⟨M, hM⟩ := isBounded_iff_forall_norm_le.mp
323 (Metric.isBounded_range_of_tendsto (fun n ↦ b.proj n x) (tendsto_proj b x))
324 exact ⟨M, Set.forall_mem_range.mp hM⟩
325
326/-- The basis constant for Schauder bases (supremum over projections) as `enorm`. -/
327noncomputable def enormProjBound : ℝ≥0∞ := ⨆ n, ‖b.proj n‖ₑ
328
329/-- The enorm of any projection is bounded by the basis constant. -/
330theorem enorm_proj_le_enormProjBound (n : ℕ) : ‖b.proj n‖ₑ ≤ b.enormProjBound :=
331 le_iSup (fun i ↦ ‖b.proj i‖ₑ) n
332
333/-- The basis constant for Schauder bases (supremum over projections) as `nnnorm`.
334 Requires completeness to guarantee the supremum is finite,
335 see lemma `bddAbove_range_nnnorm_proj` below. -/
336noncomputable def nnnormProjBound : ℝ≥0 := ⨆ n, ‖b.proj n‖₊
337
338/-- The projection norms are bounded above in a complete space. -/
339theorem bddAbove_range_nnnorm_proj [CompleteSpace X] :
340 BddAbove (Set.range (fun n : ℕ ↦ ‖b.proj n‖₊)) := by
341 obtain ⟨C, hC⟩ := b.exists_norm_proj_le
342 have hCpos : 0 ≤ C := by simpa [proj_zero] using hC 0
343 refine ⟨C.toNNReal, ?_⟩
344 rintro _ ⟨n, rfl⟩
345 rw [← NNReal.coe_le_coe, Real.coe_toNNReal C hCpos, coe_nnnorm]
346 exact hC n
347
348/-- The `nnnorm` of any projection is bounded by the basis constant. -/
349theorem nnnorm_proj_le_nnnormProjBound [CompleteSpace X] (n : ℕ) :
350 ‖b.proj n‖₊ ≤ b.nnnormProjBound :=
351 le_ciSup (bddAbove_range_nnnorm_proj b) n
352
353/-- The norm of any projection is bounded by the basis constant. -/
354theorem norm_proj_le_nnnormProjBound [CompleteSpace X] (n : ℕ) :
355 ‖b.proj n‖ ≤ b.nnnormProjBound :=
356 mod_cast b.nnnorm_proj_le_nnnormProjBound n
357
358/-!
359### Construction of Schauder basis
360
361We explain how to construct a Schauder basis from a sequence `P n` of projections
362satisfying `P n ∘ P m = P (min n m)`, converging to the identity pointwise, and such that each
363`P (n+1) - P n` has rank one. The idea is to define the basis vectors as
364`e n = (P (n+1) - P n) x` for some `x` such that this is non-zero, and then
365show that these vectors form a Schauder basis. -/
366
367/-- The difference operator `P (n + 1) - P n`. -/
368def succSub (P : ℕ → X →L[𝕜] X) (n : ℕ) : X →L[𝕜] X := P (n + 1) - P n
369
370/-- The sum of `succSub` operators up to `n` equals `P n`. -/
371@[simp]
372lemma sum_succSub (P : ℕ → X →L[𝕜] X) (h0 : P 0 = 0) (n : ℕ) :
373 ∑ i ∈ Finset.range n, succSub P i = P n := by
374 induction n with
375 | zero => simp [h0]
376 | succ n ih => rw [Finset.sum_range_succ, ih, succSub]; abel
377
378/-- The operators `succSub P i` satisfy a biorthogonality relation. -/
379lemma succSub_ortho {P : ℕ → X →L[𝕜] X} (hcomp : ∀ n m, ∀ x : X, P n (P m x) = P (min n m) x)
380 (i j : ℕ) (x : X) : succSub P i (succSub P j x) = if i = j then succSub P j x else 0 := by
381 simp only [succSub, _root_.sub_apply, map_sub, hcomp,
382 Nat.add_min_add_right]
383 split_ifs with h
384 · rw [h, min_self, min_eq_right (Nat.le_succ j), Nat.min_eq_left (Nat.le_succ j)]
385 abel
386 · rcases Nat.lt_or_gt_of_ne h with h' | h'
387 · rw [min_eq_left_of_lt h', min_eq_left (Nat.succ_le_of_lt h'),
388 min_eq_left_of_lt (Nat.lt_succ_of_lt h')]
389 abel
390 · rw [min_eq_right_of_lt h', min_eq_right (Nat.succ_le_of_lt h'),
391 min_eq_right_of_lt (Nat.lt_succ_of_lt h')]
392 abel
393
394/-- Assuming that the `finrank` of the range of `P n` is `n` then the `finrank` of the range of
395 `succSub P n` is `1`. -/
396lemma finrank_range_succSub_eq_one {P : ℕ → X →L[𝕜] X}
397 (hrank : ∀ n, Module.finrank 𝕜 (P n).toLinearMap.range = n)
398 (hcomp : ∀ n m, ∀ x : X, P n (P m x) = P (min n m) x) (n : ℕ) :
399 Module.finrank 𝕜 (succSub P n).toLinearMap.range = 1 := by
400 let U := (succSub P n).toLinearMap.range
401 let V := (P n).toLinearMap.range
402 let W := (P (n + 1)).toLinearMap.range
403 have hV : V ≤ W := by
404 rintro _ ⟨y, rfl⟩
405 exact ⟨P n y, by simp [ContinuousLinearMap.coe_coe, hcomp]⟩
406 have hUW : U ≤ W := by
407 rintro _ ⟨y, rfl⟩
408 exact Submodule.sub_mem W ⟨y, rfl⟩ (hV ⟨y, rfl⟩)
409 have hW : W = U ⊔ V := by
410 apply le_antisymm
411 · rintro x ⟨y, hy⟩
412 rw [← hy, ContinuousLinearMap.coe_coe, ← sub_add_cancel ((P (n + 1)) y) ((P n) y)]
413 exact Submodule.add_mem_sup ⟨y, rfl⟩ ⟨y, rfl⟩
414 · exact sup_le hUW hV
415 have hdisj : U ⊓ V = ⊥ := eq_bot_iff.mpr fun x ⟨⟨y, hy⟩, ⟨z, hz⟩⟩ ↦ by
416 simp only [Submodule.mem_bot]
417 calc x = (P n) x := by rw [← hz, ContinuousLinearMap.coe_coe, hcomp, min_self]
418 _ = 0 := by rw [← hy, ContinuousLinearMap.coe_coe]; simp [succSub, map_sub, hcomp]
419 have : FiniteDimensional 𝕜 W := .of_finrank_pos (by rw [hrank]; exact Nat.succ_pos n)
420 have : FiniteDimensional 𝕜 U := Submodule.finiteDimensional_of_le hUW
421 have : FiniteDimensional 𝕜 V := Submodule.finiteDimensional_of_le hV
422 have h_dim := Submodule.finrank_sup_add_finrank_inf_eq U V
423 rw [hdisj, finrank_bot, add_zero, ← hW, hrank, hrank, Nat.add_comm] at h_dim
424 exact Nat.add_right_cancel h_dim.symm
425
426variable (𝕜 X) in
427/-- Data for constructing a Schauder basis from a sequence of finite-rank projections.
428
429Given a sequence of continuous linear maps `P n : X →L[𝕜] X` satisfying:
430* `P 0 = 0` and `finrank(range(P n)) = n`,
431* `P n ∘ P m = P (min n m)` (the projections are nested and commute),
432* `P n x → x` for every `x` (pointwise convergence to the identity),
433
434the differences `succSub P n = P (n+1) - P n` are rank-one operators
435(see `finrank_range_succSub_eq_one`). Choosing a nonzero vector `e n` in the range of each
436`succSub P n` yields a Schauder basis for `X`.
437
438Use `RankOneDecomposition.basis` to construct the `SchauderBasis` from this data. -/
439structure RankOneDecomposition where
440 /-- The sequence of finite-rank projections. -/
441 P : ℕ → X →L[𝕜] X
442 /-- The sequence of candidate basis vectors. -/
443 e : ℕ → X
444 /-- The projections start at `0`. -/
445 proj_zero : P 0 = 0
446 /-- The `n`-th projection has rank `n`. -/
447 finrank_range (n : ℕ) : Module.finrank 𝕜 (P n).toLinearMap.range = n
448 /-- The projections commute and are nested `P n (P m) = P (min n m)`. -/
449 proj_comp (n m : ℕ) (x : X) : P n (P m x) = P (min n m) x
450 /-- The projections converge pointwise to the identity. -/
451 proj_tendsto (x : X) : Tendsto (fun n ↦ P n x) atTop (𝓝 x)
452 /-- The vector `e_n` lies in the range of the operator `succSub P n = P (n+1) - P n`. -/
453 e_mem_range (n : ℕ) : e n ∈ (succSub P n).toLinearMap.range
454 /-- The vector `e_n` is non-zero. -/
455 e_ne_zero (n : ℕ) : e n ≠ 0
456
457namespace RankOneDecomposition
458
459variable (D : RankOneDecomposition 𝕜 X)
460
461/-- There exists a coefficient scaling `e n` to match `(succSub D.P n) x`. -/
462lemma exists_coeff (n : ℕ) (x : X) :
463 ∃ c : 𝕜, c • D.e n = (succSub D.P n) x := by
464 let S := (succSub D.P n).toLinearMap
465 have hrank : Module.finrank 𝕜 S.range = 1 :=
466 finrank_range_succSub_eq_one D.finrank_range D.proj_comp n
467 have : FiniteDimensional 𝕜 S.range := .of_finrank_pos (hrank.symm ▸ zero_lt_one)
468 have hspan : Submodule.span 𝕜 {D.e n} = S.range := by
469 apply Submodule.eq_of_le_of_finrank_eq
470 · exact (Submodule.span_singleton_le_iff_mem _ _).mpr (D.e_mem_range n)
471 · simp [hrank, finrank_span_singleton (D.e_ne_zero n)]
472 exact Submodule.mem_span_singleton.mp (hspan.symm ▸ LinearMap.mem_range_self S x)
473
474/-- The coefficient functional value for the basis construction. -/
475def basisCoeff (n : ℕ) (x : X) : 𝕜 :=
476 Classical.choose (exists_coeff D n x)
477
478/-- The coefficient satisfies `basisCoeff D n x • D.e n = (succSub D.P n) x`. -/
479@[simp]
480lemma basisCoeff_spec (n : ℕ) (x : X) :
481 basisCoeff D n x • D.e n = (succSub D.P n) x :=
482 Classical.choose_spec (exists_coeff D n x)
483
484/-- Constructs a Schauder basis from rank one decomposition. -/
485def basis : SchauderBasis 𝕜 X :=
486 let coeff := basisCoeff D
487 have hcoeff : ∀ n x, (succSub D.P n) x = coeff n x • D.e n := fun n x ↦
488 (basisCoeff_spec D n x).symm
489 { basis := D.e
490 coord := fun n ↦ LinearMap.mkContinuous
491 { toFun := coeff n
492 map_add' := fun x y ↦ smul_left_injective 𝕜 (D.e_ne_zero n) <| by
493 simp only [add_smul, ← hcoeff, map_add]
494 map_smul' := fun c x ↦ smul_left_injective 𝕜 (D.e_ne_zero n) <| by
495 dsimp only [RingHom.id_apply]
496 rw [smul_eq_mul, ← smul_smul, ← hcoeff, ← hcoeff, map_smul] }
497 (‖succSub D.P n‖ / ‖D.e n‖)
498 (fun x ↦ by
499 rw [div_mul_eq_mul_div, le_div_iff₀ (norm_pos_iff.mpr (D.e_ne_zero n))]
500 calc ‖coeff n x‖ * ‖D.e n‖ = ‖coeff n x • D.e n‖ := (norm_smul _ _).symm
501 _ = ‖(succSub D.P n) x‖ := by rw [hcoeff]
502 _ ≤ ‖succSub D.P n‖ * ‖x‖ := ContinuousLinearMap.le_opNorm _ _)
503 ortho := fun i j ↦ smul_left_injective 𝕜 (D.e_ne_zero i) <| by
504 obtain ⟨x, hx⟩ : ∃ x, (succSub D.P j) x = D.e j := D.e_mem_range j
505 simp only [mkContinuous_apply, LinearMap.coe_mk, AddHom.coe_mk]
506 rw [← hcoeff, ← hx, succSub_ortho D.proj_comp, hx]
507 simp only [Pi.single_apply]
508 split_ifs with h <;> simp [h]
509 expansion := fun x ↦ by
510 rw [HasSum, SummationFilter.conditional_filter_eq_map_range, tendsto_map'_iff]
511 exact (D.proj_tendsto x).congr fun n ↦ by
512 simp only [Function.comp, LinearMap.coe_mk, AddHom.coe_mk,
513 LinearMap.mkContinuous_apply, ← hcoeff]
514 rw [← _root_.sum_apply, sum_succSub D.P D.proj_zero] }
515
516/-- The projections of the constructed basis correspond to the input data `D.P`. -/
517@[simp]
518theorem basis_proj : (basis D).proj = D.P := by
519 ext n _
520 rw [SchauderBasis.proj_apply, ← sum_succSub D.P D.proj_zero n]
521 simp only [_root_.sum_apply]
522 refine Finset.sum_congr rfl fun i _ ↦ ?_
523 dsimp [basis, mkContinuous_apply, IsLinearMap.mk'_apply]
524 rw [basisCoeff_spec]
525
526/-- The sequence of the constructed basis corresponds to the input data `D.e`. -/
527@[simp]
528theorem basis_coe : ⇑(basis D) = D.e :=
529 rfl
530
531end RankOneDecomposition
532
533end SchauderBasis