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

Commit 1a43888

Browse files
urkudsgouezel
andcommitted
feat(analysis/normed_space/operator_norm): bundle more arguments (#6207)
* Drop `lmul_left` in favor of a partially applied `lmul`. * Use `lmul_left_right` in `has_fderiv_at_ring_inverse` and related lemmas. * Add bundled `compL`, `lmulₗᵢ`, `lsmul`. * Make `𝕜` argument in `of_homothety` implicit. * Add `deriv₂` and `bilinear_comp`. Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr>
1 parent 8d9eb26 commit 1a43888

File tree

5 files changed

+178
-57
lines changed

5 files changed

+178
-57
lines changed

src/analysis/analytic/linear.lean

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ the formal power series `f x = f a + f (x - a)`.
1515
variables {𝕜 : Type*} [nondiscrete_normed_field 𝕜]
1616
{E : Type*} [normed_group E] [normed_space 𝕜 E]
1717
{F : Type*} [normed_group F] [normed_space 𝕜 F]
18+
{G : Type*} [normed_group G] [normed_space 𝕜 G]
1819

1920
open_locale topological_space classical big_operators nnreal ennreal
2021
open set filter asymptotics
@@ -50,4 +51,48 @@ protected theorem has_fpower_series_at (f : E →L[𝕜] F) (x : E) :
5051
protected theorem analytic_at (f : E →L[𝕜] F) (x : E) : analytic_at 𝕜 f x :=
5152
(f.has_fpower_series_at x).analytic_at
5253

54+
/-- Reinterpret a bilinear map `f : E →L[𝕜] F →L[𝕜] G` as a multilinear map
55+
`(E × F) [×2]→L[𝕜] G`. This multilinear map is the second term in the formal
56+
multilinear series expansion of `uncurry f`. It is given by
57+
`f.uncurry_bilinear ![(x, y), (x', y')] = f x y'`. -/
58+
def uncurry_bilinear (f : E →L[𝕜] F →L[𝕜] G) : (E × F) [×2]→L[𝕜] G :=
59+
@continuous_linear_map.uncurry_left 𝕜 1 (λ _, E × F) G _ _ _ _ _ $
60+
(↑(continuous_multilinear_curry_fin1 𝕜 (E × F) G).symm : (E × F →L[𝕜] G) →L[𝕜] _).comp $
61+
f.bilinear_comp (fst _ _ _) (snd _ _ _)
62+
63+
@[simp] lemma uncurry_bilinear_apply (f : E →L[𝕜] F →L[𝕜] G) (m : fin 2 → E × F) :
64+
f.uncurry_bilinear m = f (m 0).1 (m 1).2 :=
65+
rfl
66+
67+
/-- Formal multilinear series expansion of a bilinear function `f : E →L[𝕜] F →L[𝕜] G`. -/
68+
@[simp] def fpower_series_bilinear (f : E →L[𝕜] F →L[𝕜] G) (x : E × F) :
69+
formal_multilinear_series 𝕜 (E × F) G
70+
| 0 := continuous_multilinear_map.curry0 𝕜 _ (f x.1 x.2)
71+
| 1 := (continuous_multilinear_curry_fin1 𝕜 (E × F) G).symm (f.deriv₂ x)
72+
| 2 := f.uncurry_bilinear
73+
| _ := 0
74+
75+
@[simp] lemma fpower_series_bilinear_radius (f : E →L[𝕜] F →L[𝕜] G) (x : E × F) :
76+
(f.fpower_series_bilinear x).radius = ∞ :=
77+
(f.fpower_series_bilinear x).radius_eq_top_of_forall_image_add_eq_zero 3 $ λ n, rfl
78+
79+
protected theorem has_fpower_series_on_ball_bilinear (f : E →L[𝕜] F →L[𝕜] G) (x : E × F) :
80+
has_fpower_series_on_ball (λ x : E × F, f x.1 x.2) (f.fpower_series_bilinear x) x ∞ :=
81+
{ r_le := by simp,
82+
r_pos := ennreal.coe_lt_top,
83+
has_sum := λ y _, (has_sum_nat_add_iff' 3).1 $
84+
begin
85+
simp only [finset.sum_range_succ, finset.sum_range_one, prod.fst_add, prod.snd_add,
86+
f.map_add₂],
87+
dsimp, simp only [add_comm, add_left_comm, sub_self, has_sum_zero]
88+
end }
89+
90+
protected theorem has_fpower_series_at_bilinear (f : E →L[𝕜] F →L[𝕜] G) (x : E × F) :
91+
has_fpower_series_at (λ x : E × F, f x.1 x.2) (f.fpower_series_bilinear x) x :=
92+
⟨∞, f.has_fpower_series_on_ball_bilinear x⟩
93+
94+
protected theorem analytic_at_bilinear (f : E →L[𝕜] F →L[𝕜] G) (x : E × F) :
95+
analytic_at 𝕜 (λ x : E × F, f x.1 x.2) x :=
96+
(f.has_fpower_series_at_bilinear x).analytic_at
97+
5398
end continuous_linear_map

src/analysis/calculus/fderiv.lean

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2379,7 +2379,7 @@ open normed_ring continuous_linear_map ring
23792379
/-- At an invertible element `x` of a normed algebra `R`, the Fréchet derivative of the inversion
23802380
operation is the linear map `λ t, - x⁻¹ * t * x⁻¹`. -/
23812381
lemma has_fderiv_at_ring_inverse (x : units R) :
2382-
has_fderiv_at ring.inverse (- (lmul_right 𝕜 R ↑x⁻¹).comp (lmul_left 𝕜 R ↑x⁻¹)) x :=
2382+
has_fderiv_at ring.inverse (-lmul_left_right 𝕜 R ↑x⁻¹ ↑x⁻¹) x :=
23832383
begin
23842384
have h_is_o : is_o (λ (t : R), inverse (↑x + t) - ↑x⁻¹ + ↑x⁻¹ * t * ↑x⁻¹)
23852385
(λ (t : R), t) (𝓝 0),
@@ -2394,16 +2394,15 @@ begin
23942394
simp only [has_fderiv_at, has_fderiv_at_filter],
23952395
convert h_is_o.comp_tendsto h_lim,
23962396
ext y,
2397-
simp only [coe_comp', function.comp_app, lmul_right_apply, lmul_left_apply, neg_apply,
2398-
inverse_unit x, units.inv_mul, add_sub_cancel'_right, mul_sub, sub_mul, one_mul],
2399-
abel
2397+
simp only [coe_comp', function.comp_app, lmul_left_right_apply, neg_apply, inverse_unit x,
2398+
units.inv_mul, add_sub_cancel'_right, mul_sub, sub_mul, one_mul, sub_neg_eq_add]
24002399
end
24012400

24022401
lemma differentiable_at_inverse (x : units R) : differentiable_at 𝕜 (@ring.inverse R _) x :=
24032402
(has_fderiv_at_ring_inverse x).differentiable_at
24042403

24052404
lemma fderiv_inverse (x : units R) :
2406-
fderiv 𝕜 (@ring.inverse R _) x = - (lmul_right 𝕜 R ↑x⁻¹).comp (lmul_left 𝕜 R ↑x⁻¹) :=
2405+
fderiv 𝕜 (@ring.inverse R _) x = - lmul_left_right 𝕜 R ↑x⁻¹ ↑x⁻¹ :=
24072406
(has_fderiv_at_ring_inverse x).fderiv
24082407

24092408
end algebra_inverse

src/analysis/calculus/times_cont_diff.lean

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2386,18 +2386,16 @@ begin
23862386
{ use (ftaylor_series_within 𝕜 inverse univ),
23872387
rw [le_antisymm hm bot_le, has_ftaylor_series_up_to_on_zero_iff],
23882388
split,
2389-
{ rintros _ ⟨x', hx'⟩,
2390-
rw ← hx',
2389+
{ rintros _ ⟨x', rfl⟩,
23912390
exact (inverse_continuous_at x').continuous_within_at },
23922391
{ simp [ftaylor_series_within] } } },
23932392
{ apply times_cont_diff_at_succ_iff_has_fderiv_at.mpr,
2394-
refine ⟨λ (x : R), - lmul_left_right 𝕜 R (inverse x, inverse x), _, _⟩,
2393+
refine ⟨λ (x : R), - lmul_left_right 𝕜 R (inverse x) (inverse x), _, _⟩,
23952394
{ refine ⟨{y : R | is_unit y}, x.nhds, _⟩,
2396-
intros y hy,
2397-
cases mem_set_of_eq.mp hy with y' hy',
2398-
rw [← hy', inverse_unit],
2399-
exact @has_fderiv_at_ring_inverse 𝕜 _ _ _ _ _ y' },
2400-
{ exact (lmul_left_right_is_bounded_bilinear 𝕜 R).times_cont_diff.neg.comp_times_cont_diff_at
2395+
rintros _ ⟨y, rfl⟩,
2396+
rw [inverse_unit],
2397+
exact has_fderiv_at_ring_inverse y },
2398+
{ convert (lmul_left_right_is_bounded_bilinear 𝕜 R).times_cont_diff.neg.comp_times_cont_diff_at
24012399
(x : R) (IH.prod IH) } },
24022400
{ exact times_cont_diff_at_top.mpr Itop }
24032401
end

src/analysis/normed_space/bounded_linear_maps.lean

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,16 @@ structure is_bounded_bilinear_map (f : E × F → G) : Prop :=
201201
variable {𝕜}
202202
variable {f : E × F → G}
203203

204+
lemma continuous_linear_map.is_bounded_bilinear_map (f : E →L[𝕜] F →L[𝕜] G) :
205+
is_bounded_bilinear_map 𝕜 (λ x : E × F, f x.1 x.2) :=
206+
{ add_left := λ x₁ x₂ y, by rw [f.map_add, continuous_linear_map.add_apply],
207+
smul_left := λ c x y, by rw [f.map_smul _, continuous_linear_map.smul_apply],
208+
add_right := λ x, (f x).map_add,
209+
smul_right := λ c x y, (f x).map_smul c y,
210+
bound := ⟨max ∥f∥ 1, zero_lt_one.trans_le (le_max_right _ _),
211+
λ x y, (f.le_op_norm₂ x y).trans $
212+
by apply_rules [mul_le_mul_of_nonneg_right, norm_nonneg, le_max_left]⟩ }
213+
204214
protected lemma is_bounded_bilinear_map.is_O (h : is_bounded_bilinear_map 𝕜 f) :
205215
asymptotics.is_O f (λ p : E × F, ∥p.1∥ * ∥p.2∥) ⊤ :=
206216
let ⟨C, Cpos, hC⟩ := h.bound in asymptotics.is_O.of_bound _ $
@@ -379,17 +389,8 @@ variables (𝕜)
379389
/-- The function `lmul_left_right : 𝕜' × 𝕜' → (𝕜' →L[𝕜] 𝕜')` is a bounded bilinear map. -/
380390
lemma continuous_linear_map.lmul_left_right_is_bounded_bilinear
381391
(𝕜' : Type*) [normed_ring 𝕜'] [normed_algebra 𝕜 𝕜'] :
382-
is_bounded_bilinear_map 𝕜 (continuous_linear_map.lmul_left_right 𝕜 𝕜') :=
383-
{ add_left := λ v₁ v₂ w, by {ext t, simp [add_comm, add_mul]},
384-
smul_left := λ c v w, by {ext, simp },
385-
add_right := λ v w₁ w₂, by {ext t, simp [add_comm, mul_add]},
386-
smul_right := λ c v w, by {ext, simp },
387-
bound := begin
388-
refine ⟨1, by linarith, _⟩,
389-
intros v w,
390-
rw one_mul,
391-
apply continuous_linear_map.lmul_left_right_norm_le,
392-
end }
392+
is_bounded_bilinear_map 𝕜 (λ p : 𝕜' × 𝕜', continuous_linear_map.lmul_left_right 𝕜 𝕜' p.1 p.2) :=
393+
(continuous_linear_map.lmul_left_right 𝕜 𝕜').is_bounded_bilinear_map
393394

394395
variables {𝕜}
395396

@@ -420,6 +421,6 @@ by { simp_rw [←dist_zero_right, ←f.map_zero], exact isometry.dist_eq hf _ _
420421
/-- Construct a continuous linear equiv from a linear map that is also an isometry with full range. -/
421422
def continuous_linear_equiv.of_isometry (f : E →ₗ[𝕜] F) (hf : isometry f) (hfr : f.range = ⊤) :
422423
E ≃L[𝕜] F :=
423-
continuous_linear_equiv.of_homothety 𝕜
424+
continuous_linear_equiv.of_homothety
424425
(linear_equiv.of_bijective f (linear_map.ker_eq_bot.mpr (isometry.injective hf)) hfr)
425426
1 zero_lt_one (λ _, by simp [one_mul, f.norm_apply_of_isometry hf])

src/analysis/normed_space/operator_norm.lean

Lines changed: 110 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import linear_algebra.finite_dimensional
77
import analysis.normed_space.linear_isometry
88
import analysis.normed_space.riesz_lemma
99
import analysis.asymptotics.asymptotics
10+
import algebra.algebra.tower
1011

1112
/-!
1213
# Operator norm on the space of continuous linear maps
@@ -755,6 +756,8 @@ private lemma le_norm_flip (f : E →L[𝕜] F →L[𝕜] G) : ∥f∥ ≤ ∥fl
755756
f.op_norm_le_bound₂ (norm_nonneg _) $ λ x y,
756757
by { rw mul_right_comm, exact (flip f).le_op_norm₂ y x }
757758

759+
@[simp] lemma flip_apply (f : E →L[𝕜] F →L[𝕜] G) (x : E) (y : F) : f.flip y x = f x y := rfl
760+
758761
@[simp] lemma flip_flip (f : E →L[𝕜] F →L[𝕜] G) :
759762
f.flip.flip = f :=
760763
by { ext, refl }
@@ -802,31 +805,99 @@ variables {𝕜 F}
802805

803806
@[simp] lemma apply_apply (v : E) (f : E →L[𝕜] F) : apply 𝕜 F v f = f v := rfl
804807

808+
variables (𝕜 E F G)
809+
810+
/-- Composition of continuous linear maps as a continuous bilinear map. -/
811+
def compL : (F →L[𝕜] G) →L[𝕜] (E →L[𝕜] F) →L[𝕜] (E →L[𝕜] G) :=
812+
linear_map.mk_continuous₂
813+
(linear_map.mk₂ _ comp add_comp smul_comp comp_add (λ c f g, comp_smul _ _ _))
814+
1 $ λ f g, by simpa only [one_mul] using op_norm_comp_le f g
815+
816+
variables {𝕜 E F G}
817+
818+
@[simp] lemma compL_apply (f : F →L[𝕜] G) (g : E →L[𝕜] F) : compL 𝕜 E F G f g = f.comp g := rfl
819+
805820
section multiplication_linear
806821
variables (𝕜) (𝕜' : Type*) [normed_ring 𝕜'] [normed_algebra 𝕜 𝕜']
807822

808-
/-- Left-multiplication in a normed algebra, considered as a continuous linear map. -/
809-
def lmul_left : 𝕜' → (𝕜' →L[𝕜] 𝕜') :=
810-
λ x, (algebra.lmul_left 𝕜 x).mk_continuous ∥x∥
811-
(λ y, by {rw algebra.lmul_left_apply, exact norm_mul_le x y})
823+
/-- Left multiplication in a normed algebra as a linear isometry to the space of
824+
continuous linear maps. -/
825+
def lmulₗᵢ : 𝕜' →ₗᵢ[𝕜] 𝕜' →L[𝕜] 𝕜' :=
826+
{ to_linear_map := (algebra.lmul 𝕜 𝕜').to_linear_map.mk_continuous₂ 1 $
827+
λ x y, by simpa using norm_mul_le x y,
828+
norm_map' := λ x, le_antisymm
829+
(op_norm_le_bound _ (norm_nonneg x) (norm_mul_le x))
830+
(by { convert ratio_le_op_norm _ (1 : 𝕜'), simp [normed_algebra.norm_one 𝕜 𝕜'] }) }
831+
832+
/-- Left multiplication in a normed algebra as a continuous bilinear map. -/
833+
def lmul : 𝕜' →L[𝕜] 𝕜' →L[𝕜] 𝕜' :=
834+
(lmulₗᵢ 𝕜 𝕜').to_continuous_linear_map
835+
836+
@[simp] lemma lmul_apply (x y : 𝕜') : lmul 𝕜 𝕜' x y = x * y := rfl
837+
838+
@[simp] lemma coe_lmulₗᵢ : ⇑(lmulₗᵢ 𝕜 𝕜') = lmul 𝕜 𝕜' := rfl
839+
840+
@[simp] lemma op_norm_lmul_apply (x : 𝕜') : ∥lmul 𝕜 𝕜' x∥ = ∥x∥ :=
841+
(lmulₗᵢ 𝕜 𝕜').norm_map x
842+
843+
@[simp] lemma op_norm_lmul : ∥lmul 𝕜 𝕜'∥ = 1 :=
844+
by haveI := normed_algebra.nontrivial 𝕜 𝕜'; exact (lmulₗᵢ 𝕜 𝕜').norm_to_continuous_linear_map
812845

813846
/-- Right-multiplication in a normed algebra, considered as a continuous linear map. -/
814-
def lmul_right : 𝕜' → (𝕜' →L[𝕜] 𝕜') :=
815-
λ x, (algebra.lmul_right 𝕜 x).mk_continuous ∥x∥
816-
(λ y, by {rw [algebra.lmul_right_apply, mul_comm], exact norm_mul_le y x})
847+
def lmul_right : 𝕜' →L[𝕜] 𝕜' →L[𝕜] 𝕜' := (lmul 𝕜 𝕜').flip
848+
849+
@[simp] lemma lmul_right_apply (x y : 𝕜') : lmul_right 𝕜 𝕜' x y = y * x := rfl
850+
851+
@[simp] lemma op_norm_lmul_right_apply (x : 𝕜') : ∥lmul_right 𝕜 𝕜' x∥ = ∥x∥ :=
852+
le_antisymm
853+
(op_norm_le_bound _ (norm_nonneg x) (λ y, (norm_mul_le y x).trans_eq (mul_comm _ _)))
854+
(by { convert ratio_le_op_norm _ (1 : 𝕜'), simp [normed_algebra.norm_one 𝕜 𝕜'] })
855+
856+
@[simp] lemma op_norm_lmul_right : ∥lmul_right 𝕜 𝕜'∥ = 1 :=
857+
(op_norm_flip (lmul 𝕜 𝕜')).trans $ op_norm_lmul _ _
858+
859+
/-- Right-multiplication in a normed algebra, considered as a linear isometry to the space of
860+
continuous linear maps. -/
861+
def lmul_rightₗᵢ : 𝕜' →ₗᵢ[𝕜] 𝕜' →L[𝕜] 𝕜' :=
862+
{ to_linear_map := lmul_right 𝕜 𝕜',
863+
norm_map' := op_norm_lmul_right_apply 𝕜 𝕜' }
864+
865+
@[simp] lemma coe_lmul_rightₗᵢ : ⇑(lmul_rightₗᵢ 𝕜 𝕜') = lmul_right 𝕜 𝕜' := rfl
817866

818867
/-- Simultaneous left- and right-multiplication in a normed algebra, considered as a continuous
819-
linear map. -/
820-
def lmul_left_right (vw : 𝕜' × 𝕜') : 𝕜' →L[𝕜] 𝕜' :=
821-
(lmul_right 𝕜 𝕜' vw.2).comp (lmul_left 𝕜 𝕜' vw.1)
868+
trilinear map. -/
869+
def lmul_left_right : 𝕜' →L[𝕜] 𝕜' →L[𝕜] 𝕜' →L[𝕜] 𝕜' :=
870+
((compL 𝕜 𝕜' 𝕜' 𝕜').comp (lmul_right 𝕜 𝕜')).flip.comp (lmul 𝕜 𝕜')
822871

823-
@[simp] lemma lmul_left_apply (x y : 𝕜') : lmul_left 𝕜 𝕜' x y = x * y := rfl
824-
@[simp] lemma lmul_right_apply (x y : 𝕜') : lmul_right 𝕜 𝕜' x y = y * x := rfl
825-
@[simp] lemma lmul_left_right_apply (vw : 𝕜' × 𝕜') (x : 𝕜') :
826-
lmul_left_right 𝕜 𝕜' vw x = vw.1 * x * vw.2 := rfl
872+
@[simp] lemma lmul_left_right_apply (x y z : 𝕜') :
873+
lmul_left_right 𝕜 𝕜' x y z = x * z * y := rfl
874+
875+
lemma op_norm_lmul_left_right_apply_apply_le (x y : 𝕜') :
876+
∥lmul_left_right 𝕜 𝕜' x y∥ ≤ ∥x∥ * ∥y∥ :=
877+
(op_norm_comp_le _ _).trans_eq $ by simp [mul_comm]
878+
879+
lemma op_norm_lmul_left_right_apply_le (x : 𝕜') :
880+
∥lmul_left_right 𝕜 𝕜' x∥ ≤ ∥x∥ :=
881+
op_norm_le_bound _ (norm_nonneg x) (op_norm_lmul_left_right_apply_apply_le 𝕜 𝕜' x)
882+
883+
lemma op_norm_lmul_left_right_le :
884+
∥lmul_left_right 𝕜 𝕜'∥ ≤ 1 :=
885+
op_norm_le_bound _ zero_le_one (λ x, (one_mul ∥x∥).symm ▸ op_norm_lmul_left_right_apply_le 𝕜 𝕜' x)
827886

828887
end multiplication_linear
829888

889+
section smul_linear
890+
891+
variables (𝕜) (𝕜' : Type*) [normed_field 𝕜'] [normed_algebra 𝕜 𝕜']
892+
[normed_space 𝕜' E] [is_scalar_tower 𝕜 𝕜' E]
893+
894+
/-- Scalar multiplication as a continuous bilinear map. -/
895+
def lsmul : 𝕜' →L[𝕜] E →L[𝕜] E :=
896+
((algebra.lsmul 𝕜 E).to_linear_map : 𝕜' →ₗ[𝕜] E →ₗ[𝕜] E).mk_continuous₂ 1 $
897+
λ c x, by simpa only [one_mul] using (norm_smul c x).le
898+
899+
end smul_linear
900+
830901
section restrict_scalars
831902

832903
variables {𝕜' : Type*} [nondiscrete_normed_field 𝕜'] [normed_algebra 𝕜' 𝕜]
@@ -1004,23 +1075,23 @@ begin
10041075
rw [← mul_assoc, inv_mul_cancel (ne_of_lt ha).symm, one_mul],
10051076
end
10061077

1007-
variable (𝕜)
1008-
10091078
/-- A linear equivalence which is a homothety is a continuous linear equivalence. -/
10101079
def of_homothety (f : E ≃ₗ[𝕜] F) (a : ℝ) (ha : 0 < a) (hf : ∀x, ∥f x∥ = a * ∥x∥) : E ≃L[𝕜] F :=
10111080
{ to_linear_equiv := f,
10121081
continuous_to_fun := f.to_linear_map.continuous_of_bound a (λ x, le_of_eq (hf x)),
10131082
continuous_inv_fun := f.symm.to_linear_map.continuous_of_bound a⁻¹
10141083
(λ x, le_of_eq (homothety_inverse a ha f hf x)) }
10151084

1085+
variable (𝕜)
1086+
10161087
lemma to_span_nonzero_singleton_homothety (x : E) (h : x ≠ 0) (c : 𝕜) :
10171088
∥linear_equiv.to_span_nonzero_singleton 𝕜 E x h c∥ = ∥x∥ * ∥c∥ :=
10181089
continuous_linear_map.to_span_singleton_homothety _ _ _
10191090

10201091
/-- Given a nonzero element `x` of a normed space `E` over a field `𝕜`, the natural
10211092
continuous linear equivalence from `E` to the span of `x`.-/
10221093
def to_span_nonzero_singleton (x : E) (h : x ≠ 0) : 𝕜 ≃L[𝕜] (𝕜 ∙ x) :=
1023-
of_homothety 𝕜
1094+
of_homothety
10241095
(linear_equiv.to_span_nonzero_singleton 𝕜 E x h)
10251096
∥x∥
10261097
(norm_pos_iff.mpr h)
@@ -1073,22 +1144,29 @@ def linear_equiv.to_continuous_linear_equiv_of_bounds (e : E ≃ₗ[𝕜] F) (C_
10731144
namespace continuous_linear_map
10741145
variables (𝕜) (𝕜' : Type*) [normed_ring 𝕜'] [normed_algebra 𝕜 𝕜']
10751146

1076-
@[simp] lemma lmul_left_norm (v : 𝕜') : ∥lmul_left 𝕜 𝕜' v∥ = ∥v∥ :=
1077-
begin
1078-
refine le_antisymm _ _,
1079-
{ exact linear_map.mk_continuous_norm_le _ (norm_nonneg v) _ },
1080-
{ simpa [normed_algebra.norm_one 𝕜 𝕜'] using le_op_norm (lmul_left 𝕜 𝕜' v) (1:𝕜') }
1081-
end
1147+
variables {𝕜}
10821148

1083-
@[simp] lemma lmul_right_norm (v : 𝕜') : ∥lmul_right 𝕜 𝕜' v∥ = ∥v∥ :=
1084-
begin
1085-
refine le_antisymm _ _,
1086-
{ exact linear_map.mk_continuous_norm_le _ (norm_nonneg v) _ },
1087-
{ simpa [normed_algebra.norm_one 𝕜 𝕜'] using le_op_norm (lmul_right 𝕜 𝕜' v) (1:𝕜') }
1088-
end
1149+
variables {E' F' : Type*} [normed_group E'] [normed_group F'] [normed_space 𝕜 E'] [normed_space 𝕜 F']
1150+
1151+
/-- Compose a bilinear map `E →L[𝕜] F →L[𝕜] G` with two linear maps `E' →L[𝕜] E` and `F' →L[𝕜] F`. -/
1152+
def bilinear_comp (f : E →L[𝕜] F →L[𝕜] G) (gE : E' →L[𝕜] E) (gF : F' →L[𝕜] F) : E' →L[𝕜] F' →L[𝕜] G :=
1153+
((f.comp gE).flip.comp gF).flip
1154+
1155+
@[simp] lemma bilinear_comp_apply (f : E →L[𝕜] F →L[𝕜] G) (gE : E' →L[𝕜] E) (gF : F' →L[𝕜] F)
1156+
(x : E') (y : F') :
1157+
f.bilinear_comp gE gF x y = f (gE x) (gF y) :=
1158+
rfl
1159+
1160+
/-- Derivative of a continuous bilinear map `f : E →L[𝕜] F →L[𝕜] G` interpreted as a map `E × F → G`
1161+
at point `p : E × F` evaluated at `q : E × F`, as a continuous bilinear map. -/
1162+
def deriv₂ (f : E →L[𝕜] F →L[𝕜] G) : (E × F) →L[𝕜] (E × F) →L[𝕜] G :=
1163+
f.bilinear_comp (fst _ _ _) (snd _ _ _) + f.flip.bilinear_comp (snd _ _ _) (fst _ _ _)
1164+
1165+
@[simp] lemma coe_deriv₂ (f : E →L[𝕜] F →L[𝕜] G) (p : E × F) :
1166+
⇑(f.deriv₂ p) = λ q : E × F, f p.1 q.2 + f q.1 p.2 := rfl
10891167

1090-
lemma lmul_left_right_norm_le (vw : 𝕜' × 𝕜') :
1091-
∥lmul_left_right 𝕜 𝕜' vw∥ ≤ ∥vw.1∥ * ∥vw.2 :=
1092-
by simpa [mul_comm] using op_norm_comp_le (lmul_right 𝕜 𝕜' vw.2) (lmul_left 𝕜 𝕜' vw.1)
1168+
lemma map_add₂ (f : E →L[𝕜] F →L[𝕜] G) (x x' : E) (y y' : F) :
1169+
f (x + x') (y + y') = f x y + f.deriv₂ (x, y) (x', y') + f x' y' :=
1170+
by simp only [map_add, add_apply, coe_deriv₂, add_assoc]
10931171

10941172
end continuous_linear_map

0 commit comments

Comments
 (0)