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

Commit ae8a1fb

Browse files
sgouezelavigad
authored andcommitted
refactor(analysis/normed_space/bounded_linear_maps): nondiscrete normed field
1 parent 8831e0a commit ae8a1fb

File tree

1 file changed

+108
-137
lines changed

1 file changed

+108
-137
lines changed
Lines changed: 108 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/-
22
Copyright (c) 2019 Jan-David Salchow. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: Jan-David Salchow
4+
Authors: Jan-David Salchow, Sébastien Gouëzel
55
66
The space of bounded linear maps
77
@@ -20,8 +20,10 @@ variables {k : Type*}
2020
variables {E : Type*} {F : Type*}
2121

2222

23-
-- Define the subspace of bounded linear maps, introduce the notation L(E,F) for the set of bounded linear maps.
23+
-- Define the subspace of bounded linear maps.
2424
section bounded_linear_maps
25+
set_option class.instance_max_depth 50
26+
2527

2628
variables [hnfk : normed_field k] [normed_space k E] [normed_space k F]
2729
include hnfk
@@ -32,6 +34,7 @@ def bounded_linear_maps : subspace k (E → F) :=
3234
add := assume A B, is_bounded_linear_map.add,
3335
smul := assume c A, is_bounded_linear_map.smul c }
3436

37+
-- introduce the local notation L(E,F) for the set of bounded linear maps.
3538
local notation `L(` E `,` F `)` := @bounded_linear_maps k E F _ _ _
3639

3740
/-- Coerce bounded linear maps to functions. -/
@@ -41,117 +44,102 @@ instance bounded_linear_maps.to_fun : has_coe_to_fun $ L(E,F) :=
4144
@[extensionality] theorem ext {A B : L(E,F)} (H : ∀ x, A x = B x) : A = B :=
4245
set_coe.ext $ funext H
4346

44-
/-- Bounded linear maps are ... bounded -/
45-
lemma exists_bound (A : L(E,F)) : ∃ c, c > 0 ∧ ∀ x : E, ∥A x∥ ≤ c * ∥x∥ := A.property.bound
47+
def to_linear_map (A : L(E, F)) : linear_map _ E F :=
48+
{to_fun := A.val, ..A.property}
49+
50+
@[simp] lemma bounded_linear_maps.map_zero {A : L(E, F)} : A (0 : E) = 0 :=
51+
(to_linear_map A).map_zero
52+
53+
@[simp] lemma bounded_linear_maps.coe_zero {x : E} : (0 : L(E, F)) x = 0 := rfl
54+
55+
@[simp] lemma bounded_linear_maps.smul_coe {A : L(E, F)} {x : E} {c : k} :
56+
(c • A) x = c • (A x) := rfl
57+
58+
@[simp] lemma bounded_linear_maps.zero_smul {A : L(E, F)} : (0 : k) • A = 0 :=
59+
by ext; simp
4660

47-
/-- Bounded linear maps are conveniently bounded on the unit ball. -/
48-
lemma exists_bound' (A : L(E,F)) : ∃ c, c > 0 ∧ ∀ x : E, ∥x∥ ≤ 1 → ∥A x∥ ≤ c :=
49-
let ⟨c, _, H⟩ := exists_bound A in
50-
exists.intro c ⟨‹c > 0›,
51-
assume x _,
52-
calc ∥A x∥ ≤ c * ∥x∥ : H x
53-
... ≤ c * 1 : (mul_le_mul_left ‹c > 0›).mpr ‹∥x∥ ≤ 1
54-
... = c : mul_one c⟩
61+
@[simp] lemma bounded_linear_maps.one_smul {A : L(E, F)} : (1 : k) • A = A :=
62+
by ext; simp
63+
64+
/-- Bounded linear maps are ... bounded -/
65+
lemma exists_bound (A : L(E,F)) : ∃ c, 0 < c ∧ ∀ x : E, ∥A x∥ ≤ c * ∥x∥ := A.property.bound
5566

5667
end bounded_linear_maps
5768

5869
/-
59-
Now define the operator norm. We only do this for normed spaces over ℝ, since we need a
60-
scalar multiplication with reals to prove that ∥A x∥ ≤ ∥A∥ * ∥x∥. It would be enough to
61-
have a vector space over a normed field k with a real scalar multiplication and certain
62-
compatibility conditions.
70+
Now define the operator norm.
6371
6472
The main task is to show that the operator norm is definite, homogeneous, and satisfies the
65-
triangle inequality. This is done after a few preliminary lemmas necessary to deal with cSup.
73+
triangle inequality. This is done after a few preliminary lemmas necessary to deal with csupr.
6674
-/
6775
section operator_norm
6876

69-
variables [normed_space E] [normed_space F]
77+
variables [normed_field k] [normed_space k E] [normed_space k F]
7078
open lattice set
7179

72-
local notation `L(` E `,` F `)` := @bounded_linear_maps ℝ E F _ _ _
73-
74-
noncomputable def to_linear_map (A : L(E, F)) : linear_map _ E F :=
75-
{to_fun := A.val, ..A.property}
80+
local notation `L(` E `,` F `)` := @bounded_linear_maps k E F _ _ _
7681

77-
/-- The operator norm of a bounded linear map A : E → F is the sup of
78-
the set ∥A x∥ with ∥x∥ ≤ 1. If E = {0} we set ∥A∥ = 0. -/
82+
/-- The operator norm of a bounded linear map A : E → F is the sup of ∥A x∥/∥x∥. -/
7983
noncomputable def operator_norm (A : L(E, F)) : ℝ :=
80-
Sup (image (λ x, ∥A x∥) {x | ∥x∥1})
84+
supr (λ x, ∥A x∥/∥x∥)
8185

8286
noncomputable instance bounded_linear_maps.to_has_norm : has_norm L(E,F) :=
8387
{norm := operator_norm}
8488

85-
lemma norm_of_unit_ball_bdd_above (A : L(E,F)) : bdd_above (image (norm ∘ A) {x | ∥x∥ ≤ 1}) :=
86-
let ⟨c, _, H⟩ := (exists_bound' A : ∃ c, c > 0 ∧ ∀ x : E, ∥x∥ ≤ 1 → ∥A x∥ ≤ c) in
87-
bdd_above.mk c
88-
(assume r ⟨x, (_ : ∥x∥ ≤ 1), (_ : ∥A x∥ = r)⟩,
89-
show r ≤ c, from
90-
calc r = ∥A x∥ : eq.symm ‹∥A x∥ = r›
91-
... ≤ c : H x ‹∥x∥ ≤ 1›)
92-
93-
lemma zero_in_im_ball (A : L(E,F)) : (0:ℝ) ∈ {r : ℝ | ∃ (x : E), ∥x∥ ≤ 1 ∧ ∥A x∥ = r} :=
94-
have A 0 = 0, from (to_linear_map A).map_zero,
95-
exists.intro (0:E) $ and.intro (by rw[norm_zero]; exact zero_le_one) (by rw[‹A 0 = 0›]; simp)
89+
lemma bdd_above_range_norm_image_div_norm (A : L(E,F)) : bdd_above (range (λ x, ∥A x∥/∥x∥)) :=
90+
let ⟨c, _, H⟩ := (exists_bound A : ∃ c, 0 < c ∧ ∀ x : E, ∥A x∥ ≤ c * ∥x∥) in
91+
bdd_above.mk c $ forall_range_iff.2 $ λx, begin
92+
by_cases h : ∥x∥ = 0,
93+
{ simp [h, le_of_lt ‹0 < c›] },
94+
{ refine (div_le_iff _).2 (H x),
95+
simpa [ne.symm h] using le_iff_eq_or_lt.1 (norm_nonneg x) }
96+
end
9697

9798
lemma operator_norm_nonneg (A : L(E,F)) : 0 ≤ ∥A∥ :=
98-
have (0:ℝ) ∈ _, from zero_in_im_ball A,
99-
show 0 ≤ Sup (image (norm ∘ A) {x | ∥x∥ ≤ 1}), from
100-
let ⟨c, _, H⟩ := (exists_bound' A : ∃ c, c > 0 ∧ ∀ x : E, ∥x∥ ≤ 1 → ∥A x∥ ≤ c) in
101-
le_cSup (norm_of_unit_ball_bdd_above A) ‹(0:ℝ) ∈ _›
102-
103-
lemma bounded_by_operator_norm_on_unit_vector (A : L(E, F)) {x : E} (_ : ∥x∥ = 1) : ∥A x∥ ≤ ∥A∥ :=
104-
show ∥A x∥ ≤ Sup (image (norm ∘ A) {x | ∥x∥ ≤ 1}), from
105-
let ⟨c, _, _⟩ := (exists_bound A : ∃ c, c > 0 ∧ ∀ x : E, ∥ A x ∥ ≤ c * ∥ x ∥) in
106-
have ∥A x∥ ∈ (image (norm ∘ A) {x | ∥x∥ ≤ 1}), from mem_image_of_mem _ $ le_of_eq ‹∥x∥ = 1›,
107-
le_cSup (norm_of_unit_ball_bdd_above A) ‹∥A x∥ ∈ _›
99+
begin
100+
have : (0 : ℝ) = (λ x, ∥A x∥/∥x∥) 0, by simp,
101+
rw this,
102+
exact le_csupr (bdd_above_range_norm_image_div_norm A),
103+
end
108104

109105
set_option class.instance_max_depth 34
110106

111107
/-- This is the fundamental property of the operator norm: ∥A x∥ ≤ ∥A∥ * ∥x∥. -/
112108
theorem bounded_by_operator_norm {A : L(E,F)} {x : E} : ∥A x∥ ≤ ∥A∥ * ∥x∥ :=
113-
have A 0 = 0, from (to_linear_map A).map_zero,
114-
classical.by_cases
115-
(assume : x = (0:E),
116-
show ∥A x∥ ≤ ∥A∥ * ∥x∥, by rw[‹x = 0›, ‹A 0 = 0›, norm_zero, norm_zero, mul_zero]; exact le_refl 0)
117-
(assume : x ≠ (0:E),
118-
have ∥x∥ ≠ 0, from ne_of_gt $ (norm_pos_iff x).mpr ‹x ≠ 0›,
119-
have ∥∥x∥⁻¹∥ = ∥x∥⁻¹, from abs_of_nonneg $ inv_nonneg.mpr $ norm_nonneg x,
120-
have ∥∥x∥⁻¹•x∥ = 1, begin rw[norm_smul, ‹∥∥x∥⁻¹∥ = ∥x∥⁻¹›], exact inv_mul_cancel ‹∥x∥ ≠ 0end,
121-
calc ∥A x∥ = (∥x∥ * ∥x∥⁻¹) * ∥A x∥ : by rw[mul_inv_cancel ‹∥x∥ ≠ 0›]; ring
122-
... = ∥∥x∥⁻¹∥ * ∥A x∥ * ∥x∥ : by rw[‹∥∥x∥⁻¹∥ = ∥x∥⁻¹›]; ring
123-
... = ∥∥x∥⁻¹• A x ∥ * ∥x∥ : by rw[←normed_space.norm_smul ∥x∥⁻¹ (A x)]
124-
... = ∥A (∥x∥⁻¹• x)∥ * ∥x∥ : by {
125-
change ∥∥x∥⁻¹ • A.val x∥ * ∥x∥ = ∥A.val (∥x∥⁻¹ • x)∥ * ∥x∥,
126-
rw A.property.smul}
127-
... ≤ ∥A∥ * ∥x∥ : (mul_le_mul_right ((norm_pos_iff x).mpr ‹x ≠ 0›)).mpr
128-
(bounded_by_operator_norm_on_unit_vector A ‹∥∥x∥⁻¹•x∥ = 1›))
129-
130-
lemma bounded_by_operator_norm_on_unit_ball (A : L(E, F)) {x : E} (_ : ∥x∥ ≤ 1) : ∥A x∥ ≤ ∥A∥ :=
131-
calc ∥A x∥ ≤ ∥A∥ * ∥x∥ : bounded_by_operator_norm
132-
... ≤ ∥A∥ * 1 : mul_le_mul_of_nonneg_left ‹∥x∥ ≤ 1› (operator_norm_nonneg A)
133-
... = ∥A∥ : mul_one ∥A∥
134-
135-
lemma operator_norm_bounded_by {A : L(E,F)} (c : nnreal) :
136-
(∀ x : E, ∥x∥ ≤ 1 → ∥A x∥ ≤ (c:ℝ)) → ∥A∥ ≤ c :=
137-
assume H : ∀ x : E, ∥x∥ ≤ 1 → ∥A x∥ ≤ c,
138-
suffices Sup (image (norm ∘ A) {x | ∥x∥ ≤ 1}) ≤ c, by assumption,
139-
cSup_le (set.ne_empty_of_mem $ zero_in_im_ball A)
140-
(show ∀ (r : ℝ), r ∈ (image (norm ∘ A) {x | ∥x∥ ≤ 1}) → r ≤ c, from
141-
assume r ⟨x, _, _⟩,
142-
calc r = ∥A x∥ : eq.symm ‹_›
143-
... ≤ c : H x ‹_›)
144-
145-
theorem operator_norm_triangle (A : L(E,F)) (B : L(E,F)) : ∥A + B∥ ≤ ∥A∥ + ∥B∥ :=
146-
operator_norm_bounded_by (⟨∥A∥, operator_norm_nonneg A⟩ + ⟨∥B∥, operator_norm_nonneg B⟩)
147-
(assume x _, by exact
109+
begin
110+
classical, by_cases h : x = 0,
111+
{ simp [h] },
112+
{ have : ∥A x∥/∥x∥ ≤ ∥A∥, from le_csupr (bdd_above_range_norm_image_div_norm A),
113+
rwa (div_le_iff _) at this,
114+
have : ∥x∥ ≠ 0, from ne_of_gt ((norm_pos_iff x).mpr h),
115+
have I := le_iff_eq_or_lt.1 (norm_nonneg x),
116+
simpa [ne.symm this] using I }
117+
end
118+
119+
/-- If one controls the norm of every A x, then one controls the norm of A. -/
120+
lemma operator_norm_bounded_by {A : L(E,F)} {c : ℝ} (hc : 0 ≤ c) (H : ∀ x, ∥A x∥ ≤ c * ∥x∥) :
121+
∥A∥ ≤ c :=
122+
begin
123+
haveI : nonempty E := ⟨0⟩,
124+
refine csupr_le (λx, _),
125+
by_cases h : ∥x∥ = 0,
126+
{ simp [h, hc] },
127+
{ refine (div_le_iff _).2 (H x),
128+
simpa [ne.symm h] using le_iff_eq_or_lt.1 (norm_nonneg x) }
129+
end
130+
131+
/-- The operator norm satisfies the triangle inequality. -/
132+
theorem operator_norm_triangle (A B : L(E,F)) : ∥A + B∥ ≤ ∥A∥ + ∥B∥ :=
133+
operator_norm_bounded_by (add_nonneg (operator_norm_nonneg A) (operator_norm_nonneg B))
134+
(assume x,
148135
calc ∥(A + B) x∥ = ∥A x + B x∥ : by refl
149136
... ≤ ∥A x∥ + ∥B x∥ : by exact norm_triangle _ _
150-
... ≤ ∥A∥ + ∥B∥ : by exact add_le_add (bounded_by_operator_norm_on_unit_ball A ‹_›)
151-
(bounded_by_operator_norm_on_unit_ball B ‹_›))
137+
... ≤ ∥A∥ * ∥x∥ + ∥B∥ * ∥x∥ :
138+
add_le_add bounded_by_operator_norm bounded_by_operator_norm
139+
... = (∥A∥ + ∥B∥) * ∥x∥ : by ring)
152140

141+
/-- An operator is zero iff its norm vanishes. -/
153142
theorem operator_norm_zero_iff (A : L(E,F)) : ∥A∥ = 0 ↔ A = 0 :=
154-
have A 0 = 0, from (to_linear_map A).map_zero,
155143
iff.intro
156144
(assume : ∥A∥ = 0,
157145
suffices ∀ x, A x = 0, from ext this,
@@ -161,62 +149,45 @@ iff.intro
161149
... = 0 : by rw[‹∥A∥ = 0›]; ring,
162150
(norm_le_zero_iff (A x)).mp this)
163151
(assume : A = 0,
164-
let M := {r : ℝ | ∃ (x : E), ∥x∥ ≤ 1 ∧ ∥A x∥ = r} in
165-
-- note that we have M = (image (norm ∘ A) {x | ∥x∥ ≤ 1}), from rfl
166-
suffices Sup M = 0, by assumption,
167-
suffices M = {0}, by rw[this]; exact cSup_singleton 0,
168-
(set.ext_iff M {0}).mpr $ assume r, iff.intro
169-
(assume : ∃ (x : E), ∥x∥ ≤ 1 ∧ ∥A x∥ = r,
170-
let ⟨x, _, _⟩ := this in
171-
have h : ∥(0:F)∥ = r, by rwa[‹A=0›] at *,
172-
by finish)
173-
(assume : r ∈ {0},
174-
have r = 0, from set.eq_of_mem_singleton this,
175-
exists.intro (0:E) $ ⟨by rw[norm_zero]; exact zero_le_one, by rw[this, ‹A 0 = 0›]; simp⟩))
176-
177-
theorem operator_norm_homogeneous (c : ℝ) (A : L(E, F)) : ∥c • A∥ = ∥c∥ * ∥A∥ :=
178-
-- ∥c • A∥ is the supremum of the image of the map x ↦ ∥c • A x∥ on the unit ball in E
179-
-- we show that this is the same as ∥c∥ * ∥A∥ by showing 1) and 2):
180-
-- 1) ∥c∥ * ∥A∥ is an upper bound for the image of x ↦ ∥c • A x∥ on the unit ball
181-
-- 2) any w < ∥c∥ * ∥A∥ is not an upper bound (this is equivalent to showing that every upper bound is ≥ ∥c∥ * ∥A∥)
182-
suffices (∀ a ∈ _, a ≤ ∥c∥ * ∥A∥) ∧ (∀ (ub : ℝ), (∀ a ∈ _, a ≤ ub) → ∥c∥ * ∥A∥ ≤ ub), from
183-
cSup_intro' (show _ ≠ ∅, from set.ne_empty_of_mem $ zero_in_im_ball _) this.1 this.2,
184-
and.intro
185-
(show ∀ a ∈ image (λ x, ∥(c • A) x∥) {x : E | ∥x∥ ≤ 1}, a ≤ ∥c∥ * ∥A∥, from
186-
assume a (hₐ : ∃ (x : E), ∥x∥ ≤ 1 ∧ ∥(c • A) x∥ = a),
187-
let ⟨x, _, _⟩ := hₐ in
188-
calc a = ∥c • A x∥ : eq.symm ‹_›
189-
... = ∥c∥ * ∥A x∥ : by rw[←norm_smul c (A x)]; refl
190-
... ≤ ∥c∥ * ∥A∥ : mul_le_mul_of_nonneg_left
191-
(bounded_by_operator_norm_on_unit_ball A ‹∥x∥ ≤ 1›)
192-
(norm_nonneg c))
193-
(show ∀ (ub : ℝ), (∀ a ∈ image (λ (x : E), ∥(c • A) x∥) {x : E | ∥x∥ ≤ 1}, a ≤ ub) → ∥c∥ * ∥A∥ ≤ ub, from
194-
assume u u_is_ub,
195-
classical.by_cases
196-
(assume : c = 0,
197-
calc ∥c∥ * ∥A∥ = 0 : by rw[‹c=0›, norm_zero, zero_mul]
198-
... ≤ u : u_is_ub (0:ℝ) $ zero_in_im_ball _)
199-
(assume : c ≠ 0,
200-
have ∥c∥ ≠ 0, from ne_of_gt $ (norm_pos_iff c).mpr ‹c ≠ 0›,
201-
have bla : u = ∥c∥ * (∥c∥⁻¹ * u), by rw[←mul_assoc, mul_inv_cancel ‹∥c∥ ≠ 0›, one_mul],
202-
suffices ∥A∥ ≤ ∥c∥⁻¹ * u, from
203-
have u = ∥c∥ * (∥c∥⁻¹ * u), by rw[←mul_assoc, mul_inv_cancel ‹∥c∥ ≠ 0›, one_mul],
204-
by rw[this]; exact mul_le_mul_of_nonneg_left ‹_› (norm_nonneg c),
205-
cSup_le
206-
(set.ne_empty_of_mem $ zero_in_im_ball _)
207-
(assume n (H : ∃ (x : E), ∥x∥ ≤ 1 ∧ ∥A x∥ = n),
208-
let ⟨x, _, _⟩ := H in
209-
calc n = ∥A x∥ : eq.symm ‹∥A x∥ = n›
210-
... = ∥c∥⁻¹ * ∥c • A x∥ : by rw[norm_smul, ←mul_assoc, inv_mul_cancel ‹∥c∥ ≠ 0›, one_mul]
211-
... ≤ ∥c∥⁻¹ * u : mul_le_mul_of_nonneg_left (u_is_ub ∥c • A x∥ ⟨x, ‹∥x∥ ≤ 1›, rfl⟩) $
212-
inv_nonneg.mpr $ norm_nonneg c)))
152+
have ∥A∥ ≤ 0, from operator_norm_bounded_by (le_refl 0) $ by rw this; simp [le_refl],
153+
le_antisymm this (operator_norm_nonneg A))
154+
155+
section instance_70
156+
-- one needs to increase the max_depth for the following proof
157+
set_option class.instance_max_depth 70
158+
159+
/-- Auxiliary lemma to prove that the operator norm is homogeneous. -/
160+
lemma operator_norm_homogeneous_le (c : k) (A : L(E, F)) : ∥c • A∥ ≤ ∥c∥ * ∥A∥ :=
161+
begin
162+
apply operator_norm_bounded_by (mul_nonneg (norm_nonneg _) (operator_norm_nonneg _)) (λx, _),
163+
erw [norm_smul _ _, mul_assoc],
164+
exact mul_le_mul_of_nonneg_left bounded_by_operator_norm (norm_nonneg _)
165+
end
166+
167+
theorem operator_norm_homogeneous (c : k) (A : L(E, F)) : ∥c • A∥ = ∥c∥ * ∥A∥ :=
168+
begin
169+
refine le_antisymm (operator_norm_homogeneous_le c A) _,
170+
by_cases h : ∥c∥ = 0,
171+
{ have : c = 0, from (norm_eq_zero _).1 h,
172+
have I : ∥(0 : L(E, F))∥ = 0, by rw operator_norm_zero_iff,
173+
simp only [h],
174+
simp [this, I] },
175+
{ have h' : c ≠ 0, by simpa [norm_eq_zero] using h,
176+
have : ∥A∥ ≤ ∥c • A∥ / ∥c∥, from calc
177+
∥A∥ = ∥(1 : k) • A∥ : by rw bounded_linear_maps.one_smul
178+
... = ∥c⁻¹ • c • A∥ : by rw [smul_smul, inv_mul_cancel h']
179+
... ≤ ∥c⁻¹∥ * ∥c • A∥ : operator_norm_homogeneous_le _ _
180+
... = ∥c • A∥ / ∥c∥ : by rw [norm_inv, div_eq_inv_mul],
181+
rwa [le_div_iff, mul_comm] at this,
182+
simpa [ne.symm h] using le_iff_eq_or_lt.1 (norm_nonneg c) }
183+
end
184+
end instance_70
213185

214186
/-- Expose L(E,F) equipped with the operator norm as normed space. -/
215-
noncomputable instance bounded_linear_maps.to_normed_space : normed_space L(E,F) :=
216-
normed_space.of_core L(E,F) {
187+
noncomputable instance bounded_linear_maps.to_normed_space : normed_space k L(E,F) :=
188+
normed_space.of_core k L(E,F) {
217189
norm_eq_zero_iff := operator_norm_zero_iff,
218190
norm_smul := operator_norm_homogeneous,
219-
triangle := operator_norm_triangle
220-
}
191+
triangle := operator_norm_triangle }
221192

222193
end operator_norm

0 commit comments

Comments
 (0)