1
+ import algebra.field
2
+ import tactic.norm_num
3
+ import analysis.normed_space
4
+
5
+ noncomputable theory
6
+ local attribute [instance] classical.prop_decidable
7
+
8
+ local notation f `→_{`:50 a `}`:0 b := filter.tendsto f (nhds a) (nhds b)
9
+
10
+
11
+ variables {k : Type *} [normed_field k]
12
+ variables {E : Type *} [normed_space k E]
13
+ variables {F : Type *} [normed_space k F]
14
+ variables {G : Type *} [normed_space k G]
15
+
16
+ include k
17
+ def is_bounded_linear_map (L : E → F) := (is_linear_map L) ∧ ∃ M, M > 0 ∧ ∀ x : E, ∥ L x ∥ ≤ M *∥ x ∥
18
+
19
+ namespace is_bounded_linear_map
20
+
21
+ lemma zero : is_bounded_linear_map (λ (x:E), (0 :F)) :=
22
+ ⟨is_linear_map.map_zero, exists.intro (1 :ℝ) $ by norm_num⟩
23
+
24
+ lemma id : is_bounded_linear_map (λ (x:E), x) :=
25
+ ⟨is_linear_map.id, exists.intro (1 :ℝ) $ by { norm_num, finish }⟩
26
+
27
+ lemma smul {L : E → F} (H : is_bounded_linear_map L) (c : k) :
28
+ is_bounded_linear_map (λ e, c•L e) :=
29
+ begin
30
+ by_cases h : c = 0 ,
31
+ { simp[h], exact zero },
32
+
33
+ rcases H with ⟨lin , M, Mpos, ineq⟩,
34
+ split,
35
+ { exact is_linear_map.map_smul_right lin },
36
+ { existsi ∥c∥*M,
37
+ split,
38
+ { exact mul_pos ((norm_pos_iff c).2 h) Mpos },
39
+ intro x,
40
+ simp,
41
+ exact calc ∥c • L x∥ = ∥c∥*∥L x∥ : norm_smul c (L x)
42
+ ... ≤ ∥c∥ * M * ∥x∥ : by {simp[mul_assoc, mul_le_mul_of_nonneg_left (ineq x) (norm_nonneg c)]} }
43
+ end
44
+
45
+ lemma neg {L : E → F} (H : is_bounded_linear_map L) :
46
+ is_bounded_linear_map (λ e, -L e) :=
47
+ begin
48
+ rw [show (λ e, -L e) = (λ e, (-1 )•L e), by { funext, simp }],
49
+ exact smul H (-1 )
50
+ end
51
+
52
+ lemma add {L : E → F} {P : E → F} (HL : is_bounded_linear_map L) (HP :is_bounded_linear_map P) :
53
+ is_bounded_linear_map (λ e, L e + P e) :=
54
+ begin
55
+ rcases HL with ⟨lin_L , M, Mpos, ineq_L⟩,
56
+ rcases HP with ⟨lin_P , M', M'pos, ineq_P⟩,
57
+ split, exact (is_linear_map.map_add lin_L lin_P),
58
+ existsi (M+M'),
59
+ split, exact add_pos Mpos M'pos,
60
+ intro x, simp,
61
+ exact calc
62
+ ∥L x + P x∥ ≤ ∥L x∥ + ∥P x∥ : norm_triangle _ _
63
+ ... ≤ M * ∥x∥ + M' * ∥x∥ : add_le_add (ineq_L x) (ineq_P x)
64
+ ... ≤ (M + M') * ∥x∥ : by rw ←add_mul
65
+ end
66
+
67
+ lemma sub {L : E → F} {P : E → F} (HL : is_bounded_linear_map L) (HP :is_bounded_linear_map P) :
68
+ is_bounded_linear_map (λ e, L e - P e) := add HL (neg HP)
69
+
70
+ lemma comp {L : E → F} {P : F → G} (HL : is_bounded_linear_map L) (HP :is_bounded_linear_map P) : is_bounded_linear_map (P ∘ L) :=
71
+ begin
72
+ rcases HL with ⟨lin_L , M, Mpos, ineq_L⟩,
73
+ rcases HP with ⟨lin_P , M', M'pos, ineq_P⟩,
74
+ split,
75
+ { exact is_linear_map.comp lin_P lin_L },
76
+ { existsi M'*M,
77
+ split,
78
+ { exact mul_pos M'pos Mpos },
79
+ { intro x,
80
+ exact calc
81
+ ∥P (L x)∥ ≤ M' * ∥L x∥ : ineq_P (L x)
82
+ ... ≤ M'*M*∥x∥ : by simp[mul_assoc, mul_le_mul_of_nonneg_left (ineq_L x) (le_of_lt M'pos)] } }
83
+ end
84
+
85
+ lemma continuous {L : E → F} (H : is_bounded_linear_map L) : continuous L :=
86
+ begin
87
+ rcases H with ⟨lin, M, Mpos, ineq⟩,
88
+ apply continuous_iff_tendsto.2 ,
89
+ intro x,
90
+ apply tendsto_iff_norm_tendsto_zero.2 ,
91
+ replace ineq := λ e, calc ∥L e - L x∥ = ∥L (e - x)∥ : by rw [←(lin.sub e x)]
92
+ ... ≤ M*∥e-x∥ : ineq (e-x),
93
+ have lim1 : (λ (x:E), M) →_{x} M := tendsto_const_nhds,
94
+
95
+ have lim2 : (λ e, e-x) →_{x} 0 :=
96
+ begin
97
+ have limId := continuous_iff_tendsto.1 continuous_id x,
98
+ have limx : (λ (e : E), -x) →_{x} -x := tendsto_const_nhds,
99
+ have := tendsto_add limId limx,
100
+ simp at this ,
101
+ simpa using this ,
102
+ end ,
103
+ replace lim2 := filter.tendsto.comp lim2 lim_norm_zero,
104
+ apply squeeze_zero,
105
+ { simp[norm_nonneg] },
106
+ { exact ineq },
107
+ { simpa using tendsto_mul lim1 lim2 }
108
+ end
109
+
110
+
111
+ lemma lim_zero_bounded_linear_map {L : E → F} (H : is_bounded_linear_map L) : (L →_{0 } 0 ) :=
112
+ by simpa [H.left.zero] using continuous_iff_tendsto.1 H.continuous 0
113
+
114
+ end is_bounded_linear_map
115
+
116
+ -- Next lemma is stated for real normed space but it would work as soon as the base field is an extension of ℝ
117
+ lemma bounded_continuous_linear_map {E : Type *} [normed_space ℝ E] {F : Type *} [normed_space ℝ F] {L : E → F}
118
+ (lin : is_linear_map L) (cont : continuous L ) : is_bounded_linear_map L :=
119
+ begin
120
+ split,
121
+ exact lin,
122
+
123
+ replace cont := continuous_of_metric.1 cont 1 (by norm_num),
124
+ swap, exact 0 ,
125
+ rw[lin.zero] at cont,
126
+ rcases cont with ⟨δ, δ_pos, H⟩,
127
+ revert H,
128
+ repeat { conv in (_ < _ ) { rw norm_dist } },
129
+ intro H,
130
+ existsi (δ/2 )⁻¹,
131
+ have half_δ_pos := half_pos δ_pos,
132
+ split,
133
+ exact (inv_pos half_δ_pos),
134
+ intro x,
135
+ by_cases h : x = 0 ,
136
+ { simp [h, lin.zero] }, -- case x = 0
137
+ { -- case x ≠ 0
138
+ have norm_x_pos : ∥x∥ > 0 := (norm_pos_iff x).2 h,
139
+ have norm_x : ∥x∥ ≠ 0 := mt (norm_eq_zero x).1 h,
140
+
141
+ let p := ∥x∥*(δ/2 )⁻¹,
142
+ have p_pos : p > 0 := mul_pos norm_x_pos (inv_pos $ half_δ_pos),
143
+ have p0 := ne_of_gt p_pos,
144
+
145
+ let q := (δ/2 )*∥x∥⁻¹,
146
+ have q_pos : q > 0 := div_pos half_δ_pos norm_x_pos,
147
+ have q0 := ne_of_gt q_pos,
148
+
149
+ have triv := calc
150
+ p*q = ∥x∥*((δ/2 )⁻¹*(δ/2 ))*∥x∥⁻¹ : by simp[mul_assoc]
151
+ ... = 1 : by simp [(inv_mul_cancel $ ne_of_gt half_δ_pos), mul_inv_cancel norm_x],
152
+
153
+ have norm_calc := calc ∥q•x∥ = abs(q)*∥x∥ : by {rw norm_smul, refl}
154
+ ... = q*∥x∥ : by rw [abs_of_nonneg $ le_of_lt q_pos]
155
+ ... = δ/2 : by simp [mul_assoc, inv_mul_cancel norm_x]
156
+ ... < δ : half_lt_self δ_pos,
157
+
158
+ replace H : ∀ {a : E}, ∥a∥ < δ → ∥L a∥ < 1 := by simp [dist_zero_right] at H ; assumption,
159
+
160
+ exact calc
161
+ ∥L x∥ = ∥L (1 •x)∥: by simp
162
+ ... = ∥L ((p*q)•x) ∥ : by {rw [←triv] }
163
+ ... = ∥L (p•q•x) ∥ : by rw mul_smul
164
+ ... = ∥p•L (q•x) ∥ : by rw lin.smul
165
+ ... = abs(p)*∥L (q•x) ∥ : by { rw norm_smul, refl}
166
+ ... = p*∥L (q•x) ∥ : by rw [abs_of_nonneg $ le_of_lt $ p_pos]
167
+ ... ≤ p*1 : le_of_lt $ mul_lt_mul_of_pos_left (H norm_calc) p_pos
168
+ ... = p : by simp
169
+ ... = (δ/2 )⁻¹*∥x∥ : by simp[mul_comm] }
170
+ end
0 commit comments