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

Commit 26703ef

Browse files
committed
refactor(analysis/normed_space/operator_norm): split (#18205)
The file `analysis/normed_space/operator_norm` is now nearly 2000 lines long, and it's a pretty heavy import since it now contains everything on the strong topologies, etc. This PR splits out 250 lines: - some lemmas about infinite sums under continuous linear maps to a new file `topology/algebra/module/infinite_sum` (they were already stated for topological vector spaces, so definitely in the wrong location before) - some constructors for continuous linear maps between normed spaces to a new file `analysis/normed_space/continuous_linear_map`, which is intended to be a more lightweight import Later I hope to refactor some other files (e.g. `is_R_or_C`, `analysis/complex/basic`) to import only the new file `analysis/normed_space/continuous_linear_map`, not `analysis/normed_space/operator_norm`.
1 parent 6890b00 commit 26703ef

File tree

5 files changed

+345
-240
lines changed

5 files changed

+345
-240
lines changed

src/analysis/analytic/basic.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Sébastien Gouëzel, Yury Kudryashov
66
import analysis.calculus.formal_multilinear_series
77
import analysis.specific_limits.normed
88
import logic.equiv.fin
9+
import topology.algebra.module.infinite_sum
910

1011
/-!
1112
# Analytic functions
Lines changed: 269 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,269 @@
1+
/-
2+
Copyright (c) 2019 Jan-David Salchow. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Jan-David Salchow, Sébastien Gouëzel, Jean Lo
5+
-/
6+
import analysis.normed_space.basic
7+
8+
/-! # Constructions of continuous linear maps between (semi-)normed spaces
9+
10+
A fundamental fact about (semi-)linear maps between normed spaces over sensible fields is that
11+
continuity and boundedness are equivalent conditions. That is, for normed spaces `E`, `F`, a
12+
`linear_map` `f : E →ₛₗ[σ] F` is the coercion of some `continuous_linear_map` `f' : E →SL[σ] F`, if
13+
and only if there exists a bound `C` such that for all `x`, `‖f x‖ ≤ C * ‖x‖`.
14+
15+
We prove one direction in this file: `linear_map.mk_continuous`, boundedness implies continuity. The
16+
other direction, `continuous_linear_map.bound`, is deferred to a later file, where the
17+
strong operator topology on `E →SL[σ] F` is available, because it is natural to use
18+
`continuous_linear_map.bound` to define a norm `⨆ x, ‖f x‖ / ‖x‖` on `E →SL[σ] F` and to show that
19+
this is compatible with the strong operator topology.
20+
21+
This file also contains several corollaries of `linear_map.mk_continuous`: other "easy"
22+
constructions of continuous linear maps between normed spaces.
23+
24+
This file is meant to be lightweight (it is imported by much of the analysis library); think twice
25+
before adding imports!
26+
-/
27+
28+
open metric continuous_linear_map
29+
open set real
30+
31+
open_locale nnreal
32+
33+
variables {𝕜 𝕜₂ E F G : Type*}
34+
35+
variables [normed_field 𝕜] [normed_field 𝕜₂]
36+
37+
/-! # General constructions -/
38+
39+
section seminormed
40+
41+
variables [seminormed_add_comm_group E] [seminormed_add_comm_group F] [seminormed_add_comm_group G]
42+
variables [normed_space 𝕜 E] [normed_space 𝕜₂ F] [normed_space 𝕜 G]
43+
variables {σ : 𝕜 →+* 𝕜₂} (f : E →ₛₗ[σ] F)
44+
45+
/-- Construct a continuous linear map from a linear map and a bound on this linear map.
46+
The fact that the norm of the continuous linear map is then controlled is given in
47+
`linear_map.mk_continuous_norm_le`. -/
48+
def linear_map.mk_continuous (C : ℝ) (h : ∀x, ‖f x‖ ≤ C * ‖x‖) : E →SL[σ] F :=
49+
⟨f, add_monoid_hom_class.continuous_of_bound f C h⟩
50+
51+
/-- Reinterpret a linear map `𝕜 →ₗ[𝕜] E` as a continuous linear map. This construction
52+
is generalized to the case of any finite dimensional domain
53+
in `linear_map.to_continuous_linear_map`. -/
54+
def linear_map.to_continuous_linear_map₁ (f : 𝕜 →ₗ[𝕜] E) : 𝕜 →L[𝕜] E :=
55+
f.mk_continuous (‖f 1‖) $ λ x, le_of_eq $
56+
by { conv_lhs { rw ← mul_one x }, rw [← smul_eq_mul, f.map_smul, norm_smul, mul_comm] }
57+
58+
/-- Construct a continuous linear map from a linear map and the existence of a bound on this linear
59+
map. If you have an explicit bound, use `linear_map.mk_continuous` instead, as a norm estimate will
60+
follow automatically in `linear_map.mk_continuous_norm_le`. -/
61+
def linear_map.mk_continuous_of_exists_bound (h : ∃C, ∀x, ‖f x‖ ≤ C * ‖x‖) : E →SL[σ] F :=
62+
⟨f, let ⟨C, hC⟩ := h in add_monoid_hom_class.continuous_of_bound f C hC⟩
63+
64+
lemma continuous_of_linear_of_boundₛₗ {f : E → F} (h_add : ∀ x y, f (x + y) = f x + f y)
65+
(h_smul : ∀ (c : 𝕜) x, f (c • x) = (σ c) • f x) {C : ℝ} (h_bound : ∀ x, ‖f x‖ ≤ C*‖x‖) :
66+
continuous f :=
67+
let φ : E →ₛₗ[σ] F := { to_fun := f, map_add' := h_add, map_smul' := h_smul } in
68+
add_monoid_hom_class.continuous_of_bound φ C h_bound
69+
70+
lemma continuous_of_linear_of_bound {f : E → G} (h_add : ∀ x y, f (x + y) = f x + f y)
71+
(h_smul : ∀ (c : 𝕜) x, f (c • x) = c • f x) {C : ℝ} (h_bound : ∀ x, ‖f x‖ ≤ C*‖x‖) :
72+
continuous f :=
73+
let φ : E →ₗ[𝕜] G := { to_fun := f, map_add' := h_add, map_smul' := h_smul } in
74+
add_monoid_hom_class.continuous_of_bound φ C h_bound
75+
76+
@[simp, norm_cast] lemma linear_map.mk_continuous_coe (C : ℝ) (h : ∀x, ‖f x‖ ≤ C * ‖x‖) :
77+
((f.mk_continuous C h) : E →ₛₗ[σ] F) = f := rfl
78+
79+
@[simp] lemma linear_map.mk_continuous_apply (C : ℝ) (h : ∀x, ‖f x‖ ≤ C * ‖x‖) (x : E) :
80+
f.mk_continuous C h x = f x := rfl
81+
82+
@[simp, norm_cast] lemma linear_map.mk_continuous_of_exists_bound_coe
83+
(h : ∃C, ∀x, ‖f x‖ ≤ C * ‖x‖) :
84+
((f.mk_continuous_of_exists_bound h) : E →ₛₗ[σ] F) = f := rfl
85+
86+
@[simp] lemma linear_map.mk_continuous_of_exists_bound_apply (h : ∃C, ∀x, ‖f x‖ ≤ C * ‖x‖) (x : E) :
87+
f.mk_continuous_of_exists_bound h x = f x := rfl
88+
89+
@[simp] lemma linear_map.to_continuous_linear_map₁_coe (f : 𝕜 →ₗ[𝕜] E) :
90+
(f.to_continuous_linear_map₁ : 𝕜 →ₗ[𝕜] E) = f :=
91+
rfl
92+
93+
@[simp] lemma linear_map.to_continuous_linear_map₁_apply (f : 𝕜 →ₗ[𝕜] E) (x) :
94+
f.to_continuous_linear_map₁ x = f x :=
95+
rfl
96+
97+
namespace continuous_linear_map
98+
99+
theorem antilipschitz_of_bound (f : E →SL[σ] F) {K : ℝ≥0} (h : ∀ x, ‖x‖ ≤ K * ‖f x‖) :
100+
antilipschitz_with K f :=
101+
add_monoid_hom_class.antilipschitz_of_bound _ h
102+
103+
lemma bound_of_antilipschitz (f : E →SL[σ] F) {K : ℝ≥0} (h : antilipschitz_with K f) (x) :
104+
‖x‖ ≤ K * ‖f x‖ :=
105+
add_monoid_hom_class.bound_of_antilipschitz _ h x
106+
107+
end continuous_linear_map
108+
109+
section
110+
111+
variables {σ₂₁ : 𝕜₂ →+* 𝕜} [ring_hom_inv_pair σ σ₂₁] [ring_hom_inv_pair σ₂₁ σ]
112+
113+
include σ₂₁
114+
115+
/-- Construct a continuous linear equivalence from a linear equivalence together with
116+
bounds in both directions. -/
117+
def linear_equiv.to_continuous_linear_equiv_of_bounds (e : E ≃ₛₗ[σ] F) (C_to C_inv : ℝ)
118+
(h_to : ∀ x, ‖e x‖ ≤ C_to * ‖x‖) (h_inv : ∀ x : F, ‖e.symm x‖ ≤ C_inv * ‖x‖) : E ≃SL[σ] F :=
119+
{ to_linear_equiv := e,
120+
continuous_to_fun := add_monoid_hom_class.continuous_of_bound e C_to h_to,
121+
continuous_inv_fun := add_monoid_hom_class.continuous_of_bound e.symm C_inv h_inv }
122+
123+
end
124+
125+
end seminormed
126+
127+
section normed
128+
129+
variables [normed_add_comm_group E] [normed_add_comm_group F] [normed_space 𝕜 E] [normed_space 𝕜₂ F]
130+
variables {σ : 𝕜 →+* 𝕜₂} (f g : E →SL[σ] F) (x y z : E)
131+
132+
theorem continuous_linear_map.uniform_embedding_of_bound {K : ℝ≥0} (hf : ∀ x, ‖x‖ ≤ K * ‖f x‖) :
133+
uniform_embedding f :=
134+
(add_monoid_hom_class.antilipschitz_of_bound f hf).uniform_embedding f.uniform_continuous
135+
136+
end normed
137+
138+
/-! ## Homotheties -/
139+
140+
section seminormed
141+
142+
variables [seminormed_add_comm_group E] [seminormed_add_comm_group F]
143+
variables [normed_space 𝕜 E] [normed_space 𝕜₂ F]
144+
variables {σ : 𝕜 →+* 𝕜₂} (f : E →ₛₗ[σ] F)
145+
146+
/-- A (semi-)linear map which is a homothety is a continuous linear map.
147+
Since the field `𝕜` need not have `ℝ` as a subfield, this theorem is not directly deducible from
148+
the corresponding theorem about isometries plus a theorem about scalar multiplication. Likewise
149+
for the other theorems about homotheties in this file.
150+
-/
151+
def continuous_linear_map.of_homothety (f : E →ₛₗ[σ] F) (a : ℝ) (hf : ∀x, ‖f x‖ = a * ‖x‖) :
152+
E →SL[σ] F :=
153+
f.mk_continuous a (λ x, le_of_eq (hf x))
154+
155+
variables {σ₂₁ : 𝕜₂ →+* 𝕜} [ring_hom_inv_pair σ σ₂₁] [ring_hom_inv_pair σ₂₁ σ]
156+
157+
include σ₂₁
158+
159+
lemma continuous_linear_equiv.homothety_inverse (a : ℝ) (ha : 0 < a) (f : E ≃ₛₗ[σ] F) :
160+
(∀ (x : E), ‖f x‖ = a * ‖x‖) → (∀ (y : F), ‖f.symm y‖ = a⁻¹ * ‖y‖) :=
161+
begin
162+
intros hf y,
163+
calc ‖(f.symm) y‖ = a⁻¹ * (a * ‖ (f.symm) y‖) : _
164+
... = a⁻¹ * ‖f ((f.symm) y)‖ : by rw hf
165+
... = a⁻¹ * ‖y‖ : by simp,
166+
rw [← mul_assoc, inv_mul_cancel (ne_of_lt ha).symm, one_mul],
167+
end
168+
169+
/-- A linear equivalence which is a homothety is a continuous linear equivalence. -/
170+
noncomputable def continuous_linear_equiv.of_homothety (f : E ≃ₛₗ[σ] F) (a : ℝ) (ha : 0 < a)
171+
(hf : ∀x, ‖f x‖ = a * ‖x‖) :
172+
E ≃SL[σ] F :=
173+
linear_equiv.to_continuous_linear_equiv_of_bounds f a a⁻¹
174+
(λ x, (hf x).le) (λ x, (continuous_linear_equiv.homothety_inverse a ha f hf x).le)
175+
176+
end seminormed
177+
178+
/- ## The span of a single vector -/
179+
180+
section seminormed
181+
182+
variables [seminormed_add_comm_group E] [normed_space 𝕜 E]
183+
184+
namespace continuous_linear_map
185+
186+
variable (𝕜)
187+
188+
lemma to_span_singleton_homothety (x : E) (c : 𝕜) :
189+
‖linear_map.to_span_singleton 𝕜 E x c‖ = ‖x‖ * ‖c‖ :=
190+
by {rw mul_comm, exact norm_smul _ _}
191+
192+
/-- Given an element `x` of a normed space `E` over a field `𝕜`, the natural continuous
193+
linear map from `𝕜` to `E` by taking multiples of `x`.-/
194+
def to_span_singleton (x : E) : 𝕜 →L[𝕜] E :=
195+
of_homothety (linear_map.to_span_singleton 𝕜 E x) ‖x‖ (to_span_singleton_homothety 𝕜 x)
196+
197+
lemma to_span_singleton_apply (x : E) (r : 𝕜) : to_span_singleton 𝕜 x r = r • x :=
198+
by simp [to_span_singleton, of_homothety, linear_map.to_span_singleton]
199+
200+
lemma to_span_singleton_add (x y : E) :
201+
to_span_singleton 𝕜 (x + y) = to_span_singleton 𝕜 x + to_span_singleton 𝕜 y :=
202+
by { ext1, simp [to_span_singleton_apply], }
203+
204+
lemma to_span_singleton_smul' (𝕜') [normed_field 𝕜'] [normed_space 𝕜' E]
205+
[smul_comm_class 𝕜 𝕜' E] (c : 𝕜') (x : E) :
206+
to_span_singleton 𝕜 (c • x) = c • to_span_singleton 𝕜 x :=
207+
by { ext1, rw [to_span_singleton_apply, smul_apply, to_span_singleton_apply, smul_comm], }
208+
209+
lemma to_span_singleton_smul (c : 𝕜) (x : E) :
210+
to_span_singleton 𝕜 (c • x) = c • to_span_singleton 𝕜 x :=
211+
to_span_singleton_smul' 𝕜 𝕜 c x
212+
213+
end continuous_linear_map
214+
215+
section
216+
217+
namespace continuous_linear_equiv
218+
219+
variable (𝕜)
220+
221+
lemma to_span_nonzero_singleton_homothety (x : E) (h : x ≠ 0) (c : 𝕜) :
222+
‖linear_equiv.to_span_nonzero_singleton 𝕜 E x h c‖ = ‖x‖ * ‖c‖ :=
223+
continuous_linear_map.to_span_singleton_homothety _ _ _
224+
225+
end continuous_linear_equiv
226+
227+
end
228+
229+
end seminormed
230+
231+
section normed
232+
233+
variables [normed_add_comm_group E] [normed_space 𝕜 E]
234+
235+
namespace continuous_linear_equiv
236+
variable (𝕜)
237+
238+
/-- Given a nonzero element `x` of a normed space `E₁` over a field `𝕜`, the natural
239+
continuous linear equivalence from `E₁` to the span of `x`.-/
240+
noncomputable def to_span_nonzero_singleton (x : E) (h : x ≠ 0) : 𝕜 ≃L[𝕜] (𝕜 ∙ x) :=
241+
of_homothety
242+
(linear_equiv.to_span_nonzero_singleton 𝕜 E x h)
243+
‖x‖
244+
(norm_pos_iff.mpr h)
245+
(to_span_nonzero_singleton_homothety 𝕜 x h)
246+
247+
/-- Given a nonzero element `x` of a normed space `E₁` over a field `𝕜`, the natural continuous
248+
linear map from the span of `x` to `𝕜`.-/
249+
noncomputable def coord (x : E) (h : x ≠ 0) : (𝕜 ∙ x) →L[𝕜] 𝕜 :=
250+
(to_span_nonzero_singleton 𝕜 x h).symm
251+
252+
@[simp] lemma coe_to_span_nonzero_singleton_symm {x : E} (h : x ≠ 0) :
253+
⇑(to_span_nonzero_singleton 𝕜 x h).symm = coord 𝕜 x h := rfl
254+
255+
@[simp] lemma coord_to_span_nonzero_singleton {x : E} (h : x ≠ 0) (c : 𝕜) :
256+
coord 𝕜 x h (to_span_nonzero_singleton 𝕜 x h c) = c :=
257+
(to_span_nonzero_singleton 𝕜 x h).symm_apply_apply c
258+
259+
@[simp] lemma to_span_nonzero_singleton_coord {x : E} (h : x ≠ 0) (y : 𝕜 ∙ x) :
260+
to_span_nonzero_singleton 𝕜 x h (coord 𝕜 x h y) = y :=
261+
(to_span_nonzero_singleton 𝕜 x h).apply_symm_apply y
262+
263+
@[simp] lemma coord_self (x : E) (h : x ≠ 0) :
264+
(coord 𝕜 x h) (⟨x, submodule.mem_span_singleton_self x⟩ : 𝕜 ∙ x) = 1 :=
265+
linear_equiv.coord_self 𝕜 E x h
266+
267+
end continuous_linear_equiv
268+
269+
end normed

src/analysis/normed_space/finite_dimension.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import analysis.normed_space.operator_norm
1010
import analysis.normed_space.riesz_lemma
1111
import linear_algebra.matrix.to_lin
1212
import topology.algebra.module.finite_dimension
13+
import topology.algebra.module.infinite_sum
1314
import topology.instances.matrix
1415

1516
/-!

0 commit comments

Comments
 (0)