-
Notifications
You must be signed in to change notification settings - Fork 258
/
Mul.lean
297 lines (220 loc) Β· 12.6 KB
/
Mul.lean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
/-
Copyright (c) 2019 Jan-David Salchow. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jan-David Salchow, SΓ©bastien GouΓ«zel, Jean Lo
-/
import Mathlib.Analysis.NormedSpace.OperatorNorm.NormedSpace
/-!
# Results about operator norms in normed algebras
This file (split off from `OperatorNorm.lean`) contains results about the operator norm
of multiplication and scalar-multiplication operations in normed algebras and normed modules.
-/
suppress_compilation
set_option linter.uppercaseLean3 false
open Metric
open scoped Classical NNReal Topology Uniformity
variable {π E : Type*} [NontriviallyNormedField π]
section SemiNormed
variable [SeminormedAddCommGroup E] [NormedSpace π E]
namespace ContinuousLinearMap
section MultiplicationLinear
section NonUnital
variable (π) (π' : Type*) [NonUnitalSeminormedRing π']
variable [NormedSpace π π'] [IsScalarTower π π' π'] [SMulCommClass π π' π']
/-- Multiplication in a non-unital normed algebra as a continuous bilinear map. -/
def mul : π' βL[π] π' βL[π] π' :=
(LinearMap.mul π π').mkContinuousβ 1 fun x y => by simpa using norm_mul_le x y
#align continuous_linear_map.mul ContinuousLinearMap.mul
@[simp]
theorem mul_apply' (x y : π') : mul π π' x y = x * y :=
rfl
#align continuous_linear_map.mul_apply' ContinuousLinearMap.mul_apply'
@[simp]
theorem opNorm_mul_apply_le (x : π') : βmul π π' xβ β€ βxβ :=
opNorm_le_bound _ (norm_nonneg x) (norm_mul_le x)
#align continuous_linear_map.op_norm_mul_apply_le ContinuousLinearMap.opNorm_mul_apply_le
@[deprecated] alias op_norm_mul_apply_le := opNorm_mul_apply_le -- deprecated on 2024-02-02
theorem opNorm_mul_le : βmul π π'β β€ 1 :=
LinearMap.mkContinuousβ_norm_le _ zero_le_one _
#align continuous_linear_map.op_norm_mul_le ContinuousLinearMap.opNorm_mul_le
@[deprecated] alias op_norm_mul_le := opNorm_mul_le -- deprecated on 2024-02-02
/-- Multiplication on the left in a non-unital normed algebra `π'` as a non-unital algebra
homomorphism into the algebra of *continuous* linear maps. This is the left regular representation
of `A` acting on itself.
This has more algebraic structure than `ContinuousLinearMap.mul`, but there is no longer continuity
bundled in the first coordinate. An alternative viewpoint is that this upgrades
`NonUnitalAlgHom.lmul` from a homomorphism into linear maps to a homomorphism into *continuous*
linear maps. -/
def _root_.NonUnitalAlgHom.Lmul : π' βββ[π] π' βL[π] π' :=
{ mul π π' with
map_mul' := fun _ _ β¦ ext fun _ β¦ mul_assoc _ _ _
map_zero' := ext fun _ β¦ zero_mul _ }
variable {π π'} in
@[simp]
theorem _root_.NonUnitalAlgHom.coe_Lmul : β(NonUnitalAlgHom.Lmul π π') = mul π π' :=
rfl
/-- Simultaneous left- and right-multiplication in a non-unital normed algebra, considered as a
continuous trilinear map. This is akin to its non-continuous version `LinearMap.mulLeftRight`,
but there is a minor difference: `LinearMap.mulLeftRight` is uncurried. -/
def mulLeftRight : π' βL[π] π' βL[π] π' βL[π] π' :=
((compL π π' π' π').comp (mul π π').flip).flip.comp (mul π π')
#align continuous_linear_map.mul_left_right ContinuousLinearMap.mulLeftRight
@[simp]
theorem mulLeftRight_apply (x y z : π') : mulLeftRight π π' x y z = x * z * y :=
rfl
#align continuous_linear_map.mul_left_right_apply ContinuousLinearMap.mulLeftRight_apply
theorem opNorm_mulLeftRight_apply_apply_le (x y : π') : βmulLeftRight π π' x yβ β€ βxβ * βyβ :=
(opNorm_comp_le _ _).trans <|
(mul_comm _ _).trans_le <|
mul_le_mul (opNorm_mul_apply_le _ _ _)
(opNorm_le_bound _ (norm_nonneg _) fun _ => (norm_mul_le _ _).trans_eq (mul_comm _ _))
(norm_nonneg _) (norm_nonneg _)
#align continuous_linear_map.op_norm_mul_left_right_apply_apply_le ContinuousLinearMap.opNorm_mulLeftRight_apply_apply_le
@[deprecated] -- deprecated on 2024-02-02
alias op_norm_mulLeftRight_apply_apply_le :=
opNorm_mulLeftRight_apply_apply_le
theorem opNorm_mulLeftRight_apply_le (x : π') : βmulLeftRight π π' xβ β€ βxβ :=
opNorm_le_bound _ (norm_nonneg x) (opNorm_mulLeftRight_apply_apply_le π π' x)
#align continuous_linear_map.op_norm_mul_left_right_apply_le ContinuousLinearMap.opNorm_mulLeftRight_apply_le
@[deprecated] alias op_norm_mulLeftRight_apply_le := opNorm_mulLeftRight_apply_le -- 2024-02-02
theorem opNorm_mulLeftRight_le :
-- Currently, this cannot be synthesized because it violated `synthPendingDepth` restrictions
-- see leanprover/lean4#3927
letI : Norm (π' βL[π] π' βL[π] π' βL[π] π') := hasOpNorm (E := π') (F := π' βL[π] π' βL[π] π')
βmulLeftRight π π'β β€ 1 :=
opNorm_le_bound _ zero_le_one fun x => (one_mul βxβ).symm βΈ opNorm_mulLeftRight_apply_le π π' x
#align continuous_linear_map.op_norm_mul_left_right_le ContinuousLinearMap.opNorm_mulLeftRight_le
@[deprecated] alias op_norm_mulLeftRight_le := opNorm_mulLeftRight_le -- deprecated on 2024-02-02
/-- This is a mixin class for non-unital normed algebras which states that the left-regular
representation of the algebra on itself is isometric. Every unital normed algebra with `β1β = 1` is
a regular normed algebra (see `NormedAlgebra.instRegularNormedAlgebra`). In addition, so is every
Cβ-algebra, non-unital included (see `CstarRing.instRegularNormedAlgebra`), but there are yet other
examples. Any algebra with an approximate identity (e.g., $$L^1$$) is also regular.
This is a useful class because it gives rise to a nice norm on the unitization; in particular it is
a Cβ-norm when the norm on `A` is a Cβ-norm. -/
class _root_.RegularNormedAlgebra : Prop :=
/-- The left regular representation of the algebra on itself is an isometry. -/
isometry_mul' : Isometry (mul π π')
/-- Every (unital) normed algebra such that `β1β = 1` is a `RegularNormedAlgebra`. -/
instance _root_.NormedAlgebra.instRegularNormedAlgebra {π π' : Type*} [NontriviallyNormedField π]
[SeminormedRing π'] [NormedAlgebra π π'] [NormOneClass π'] : RegularNormedAlgebra π π' where
isometry_mul' := AddMonoidHomClass.isometry_of_norm (mul π π') <|
fun x => le_antisymm (opNorm_mul_apply_le _ _ _) <| by
convert ratio_le_opNorm ((mul π π') x) (1 : π')
simp [norm_one]
variable [RegularNormedAlgebra π π']
lemma isometry_mul : Isometry (mul π π') :=
RegularNormedAlgebra.isometry_mul'
@[simp]
lemma opNorm_mul_apply (x : π') : βmul π π' xβ = βxβ :=
(AddMonoidHomClass.isometry_iff_norm (mul π π')).mp (isometry_mul π π') x
#align continuous_linear_map.op_norm_mul_apply ContinuousLinearMap.opNorm_mul_applyβ
@[deprecated] alias op_norm_mul_apply := opNorm_mul_apply -- deprecated on 2024-02-02
@[simp]
lemma opNNNorm_mul_apply (x : π') : βmul π π' xββ = βxββ :=
Subtype.ext <| opNorm_mul_apply π π' x
@[deprecated] alias op_nnnorm_mul_apply := opNNNorm_mul_apply -- deprecated on 2024-02-02
/-- Multiplication in a normed algebra as a linear isometry to the space of
continuous linear maps. -/
def mulβα΅’ : π' ββα΅’[π] π' βL[π] π' where
toLinearMap := mul π π'
norm_map' x := opNorm_mul_apply π π' x
#align continuous_linear_map.mulβα΅’ ContinuousLinearMap.mulβα΅’β
@[simp]
theorem coe_mulβα΅’ : β(mulβα΅’ π π') = mul π π' :=
rfl
#align continuous_linear_map.coe_mulβα΅’ ContinuousLinearMap.coe_mulβα΅’β
end NonUnital
section RingEquiv
variable (π E)
/-- If `M` is a normed space over `π`, then the space of maps `π βL[π] M` is linearly equivalent
to `M`. (See `ring_lmap_equiv_self` for a stronger statement.) -/
def ring_lmap_equiv_selfβ : (π βL[π] E) ββ[π] E where
toFun := fun f β¦ f 1
invFun := (ContinuousLinearMap.id π π).smulRight
map_smul' := fun a f β¦ by simp only [coe_smul', Pi.smul_apply, RingHom.id_apply]
map_add' := fun f g β¦ by simp only [add_apply]
left_inv := fun f β¦ by ext; simp only [smulRight_apply, coe_id', _root_.id, one_smul]
right_inv := fun m β¦ by simp only [smulRight_apply, id_apply, one_smul]
/-- If `M` is a normed space over `π`, then the space of maps `π βL[π] M` is linearly isometrically
equivalent to `M`. -/
def ring_lmap_equiv_self : (π βL[π] E) ββα΅’[π] E where
toLinearEquiv := ring_lmap_equiv_selfβ π E
norm_map' := by
refine fun f β¦ le_antisymm ?_ ?_
Β· simpa only [norm_one, mul_one] using le_opNorm f 1
Β· refine opNorm_le_bound' f (norm_nonneg <| f 1) (fun x _ β¦ ?_)
rw [(by rw [smul_eq_mul, mul_one] : f x = f (x β’ 1)), ContinuousLinearMap.map_smul,
norm_smul, mul_comm, (by rfl : ring_lmap_equiv_selfβ π E f = f 1)]
end RingEquiv
end MultiplicationLinear
section SMulLinear
variable (π) (π' : Type*) [NormedField π']
variable [NormedAlgebra π π'] [NormedSpace π' E] [IsScalarTower π π' E]
/-- Scalar multiplication as a continuous bilinear map. -/
def lsmul : π' βL[π] E βL[π] E :=
((Algebra.lsmul π π E).toLinearMap : π' ββ[π] E ββ[π] E).mkContinuousβ 1 fun c x => by
simpa only [one_mul] using norm_smul_le c x
#align continuous_linear_map.lsmul ContinuousLinearMap.lsmul
@[simp]
theorem lsmul_apply (c : π') (x : E) : lsmul π π' c x = c β’ x :=
rfl
#align continuous_linear_map.lsmul_apply ContinuousLinearMap.lsmul_apply
variable {π'}
theorem norm_toSpanSingleton (x : E) : βtoSpanSingleton π xβ = βxβ := by
refine' opNorm_eq_of_bounds (norm_nonneg _) (fun x => _) fun N _ h => _
Β· rw [toSpanSingleton_apply, norm_smul, mul_comm]
Β· specialize h 1
rw [toSpanSingleton_apply, norm_smul, mul_comm] at h
exact (mul_le_mul_right (by simp)).mp h
#align continuous_linear_map.norm_to_span_singleton ContinuousLinearMap.norm_toSpanSingleton
variable {π}
theorem opNorm_lsmul_apply_le (x : π') : β(lsmul π π' x : E βL[π] E)β β€ βxβ :=
ContinuousLinearMap.opNorm_le_bound _ (norm_nonneg x) fun y => norm_smul_le x y
#align continuous_linear_map.op_norm_lsmul_apply_le ContinuousLinearMap.opNorm_lsmul_apply_le
@[deprecated] alias op_norm_lsmul_apply_le := opNorm_lsmul_apply_le -- deprecated on 2024-02-02
/-- The norm of `lsmul` is at most 1 in any semi-normed group. -/
theorem opNorm_lsmul_le : β(lsmul π π' : π' βL[π] E βL[π] E)β β€ 1 := by
refine' ContinuousLinearMap.opNorm_le_bound _ zero_le_one fun x => _
simp_rw [one_mul]
exact opNorm_lsmul_apply_le _
#align continuous_linear_map.op_norm_lsmul_le ContinuousLinearMap.opNorm_lsmul_le
@[deprecated] alias op_norm_lsmul_le := opNorm_lsmul_le -- deprecated on 2024-02-02
end SMulLinear
end ContinuousLinearMap
end SemiNormed
section Normed
namespace ContinuousLinearMap
variable [NormedAddCommGroup E] [NormedSpace π E] (c : π)
variable (π) (π' : Type*)
section
variable [NonUnitalNormedRing π'] [NormedSpace π π'] [IsScalarTower π π' π']
variable [SMulCommClass π π' π'] [RegularNormedAlgebra π π'] [Nontrivial π']
@[simp]
theorem opNorm_mul : βmul π π'β = 1 :=
(mulβα΅’ π π').norm_toContinuousLinearMap
#align continuous_linear_map.op_norm_mul ContinuousLinearMap.opNorm_mulβ
@[deprecated] alias op_norm_mul := opNorm_mul -- deprecated on 2024-02-02
@[simp]
theorem opNNNorm_mul : βmul π π'ββ = 1 :=
Subtype.ext <| opNorm_mul π π'
#align continuous_linear_map.op_nnnorm_mul ContinuousLinearMap.opNNNorm_mulβ
@[deprecated] alias op_nnnorm_mul := opNNNorm_mul -- deprecated on 2024-02-02
end
/-- The norm of `lsmul` equals 1 in any nontrivial normed group.
This is `ContinuousLinearMap.opNorm_lsmul_le` as an equality. -/
@[simp]
theorem opNorm_lsmul [NormedField π'] [NormedAlgebra π π'] [NormedSpace π' E]
[IsScalarTower π π' E] [Nontrivial E] : β(lsmul π π' : π' βL[π] E βL[π] E)β = 1 := by
refine' ContinuousLinearMap.opNorm_eq_of_bounds zero_le_one (fun x => _) fun N _ h => _
Β· rw [one_mul]
apply opNorm_lsmul_apply_le
obtain β¨y, hyβ© := exists_ne (0 : E)
have := le_of_opNorm_le _ (h 1) y
simp_rw [lsmul_apply, one_smul, norm_one, mul_one] at this
refine' le_of_mul_le_mul_right _ (norm_pos_iff.mpr hy)
simp_rw [one_mul, this]
#align continuous_linear_map.op_norm_lsmul ContinuousLinearMap.opNorm_lsmul
@[deprecated] alias op_norm_lsmul := opNorm_lsmul -- deprecated on 2024-02-02
end ContinuousLinearMap
end Normed