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

Commit cc6528e

Browse files
committed
feat(analysis/calculus/fderiv): multiplication by a complex respects real differentiability (#3731)
If `f` takes values in a complex vector space and is real-differentiable, then `c f` is also real-differentiable when `c` is a complex number. This PR proves this fact and the obvious variations, in the general case of two fields where one is a normed algebra over the other one. Along the way, some material on `module.restrict_scalars` is added, notably in a normed space context.
1 parent cfcbea6 commit cc6528e

File tree

8 files changed

+325
-28
lines changed

8 files changed

+325
-28
lines changed

src/analysis/calculus/fderiv.lean

Lines changed: 157 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2432,9 +2432,8 @@ variables (𝕜 : Type*) [nondiscrete_normed_field 𝕜]
24322432
{𝕜' : Type*} [nondiscrete_normed_field 𝕜'] [normed_algebra 𝕜 𝕜']
24332433
{E : Type*} [normed_group E] [normed_space 𝕜' E]
24342434
{F : Type*} [normed_group F] [normed_space 𝕜' F]
2435-
{f : E → F} {f' : E →L[𝕜'] F} {s : set E} {x : E}
2436-
2437-
local attribute [instance] normed_space.restrict_scalars
2435+
{f : module.restrict_scalars 𝕜 𝕜' E → module.restrict_scalars 𝕜 𝕜' F}
2436+
{f' : module.restrict_scalars 𝕜 𝕜' E →L[𝕜'] module.restrict_scalars 𝕜 𝕜' F} {s : set E} {x : E}
24382437

24392438
lemma has_strict_fderiv_at.restrict_scalars (h : has_strict_fderiv_at f f' x) :
24402439
has_strict_fderiv_at f (f'.restrict_scalars 𝕜) x := h
@@ -2462,3 +2461,158 @@ lemma differentiable.restrict_scalars (h : differentiable 𝕜' f) :
24622461
λx, (h x).restrict_scalars 𝕜
24632462

24642463
end restrict_scalars
2464+
2465+
/-!
2466+
### Multiplying by a complex function respects real differentiability
2467+
2468+
Consider two functions `c : E → ℂ` and `f : E → F` where `F` is a complex vector space. If both
2469+
`c` and `f` are differentiable over `ℝ`, then so is their product. This paragraph proves this
2470+
statement, in the general version where `ℝ` is replaced by a field `𝕜`, and `ℂ` is replaced
2471+
by a normed algebra `𝕜'` over `𝕜`.
2472+
-/
2473+
section smul_algebra
2474+
2475+
variables {𝕜 : Type*} [nondiscrete_normed_field 𝕜]
2476+
{𝕜' : Type*} [nondiscrete_normed_field 𝕜'] [normed_algebra 𝕜 𝕜']
2477+
{E : Type*} [normed_group E] [normed_space 𝕜 E]
2478+
{F : Type*} [normed_group F] [normed_space 𝕜' F]
2479+
{f : E → module.restrict_scalars 𝕜 𝕜' F}
2480+
{f' : E →L[𝕜] module.restrict_scalars 𝕜 𝕜' F} {s : set E} {x : E}
2481+
{c : E → 𝕜'} {c' : E →L[𝕜] 𝕜'} {L : filter E}
2482+
2483+
theorem has_strict_fderiv_at.smul_algebra (hc : has_strict_fderiv_at c c' x)
2484+
(hf : has_strict_fderiv_at f f' x) :
2485+
has_strict_fderiv_at (λ y, c y • f y) (c x • f' + c'.smul_algebra_right (f x)) x :=
2486+
(is_bounded_bilinear_map_smul_algebra.has_strict_fderiv_at (c x, f x)).comp x $
2487+
hc.prod hf
2488+
2489+
theorem has_fderiv_within_at.smul_algebra
2490+
(hc : has_fderiv_within_at c c' s x) (hf : has_fderiv_within_at f f' s x) :
2491+
has_fderiv_within_at (λ y, c y • f y) (c x • f' + c'.smul_algebra_right (f x)) s x :=
2492+
(is_bounded_bilinear_map_smul_algebra.has_fderiv_at (c x, f x)).comp_has_fderiv_within_at x $
2493+
hc.prod hf
2494+
2495+
theorem has_fderiv_at.smul_algebra (hc : has_fderiv_at c c' x) (hf : has_fderiv_at f f' x) :
2496+
has_fderiv_at (λ y, c y • f y) (c x • f' + c'.smul_algebra_right (f x)) x :=
2497+
(is_bounded_bilinear_map_smul_algebra.has_fderiv_at (c x, f x)).comp x $
2498+
hc.prod hf
2499+
2500+
lemma differentiable_within_at.smul_algebra
2501+
(hc : differentiable_within_at 𝕜 c s x) (hf : differentiable_within_at 𝕜 f s x) :
2502+
differentiable_within_at 𝕜 (λ y, c y • f y) s x :=
2503+
(hc.has_fderiv_within_at.smul_algebra hf.has_fderiv_within_at).differentiable_within_at
2504+
2505+
@[simp] lemma differentiable_at.smul_algebra
2506+
(hc : differentiable_at 𝕜 c x) (hf : differentiable_at 𝕜 f x) :
2507+
differentiable_at 𝕜 (λ y, c y • f y) x :=
2508+
(hc.has_fderiv_at.smul_algebra hf.has_fderiv_at).differentiable_at
2509+
2510+
lemma differentiable_on.smul_algebra (hc : differentiable_on 𝕜 c s) (hf : differentiable_on 𝕜 f s) :
2511+
differentiable_on 𝕜 (λ y, c y • f y) s :=
2512+
λx hx, (hc x hx).smul_algebra (hf x hx)
2513+
2514+
@[simp] lemma differentiable.smul_algebra (hc : differentiable 𝕜 c) (hf : differentiable 𝕜 f) :
2515+
differentiable 𝕜 (λ y, c y • f y) :=
2516+
λx, (hc x).smul_algebra (hf x)
2517+
2518+
lemma fderiv_within_smul_algebra (hxs : unique_diff_within_at 𝕜 s x)
2519+
(hc : differentiable_within_at 𝕜 c s x) (hf : differentiable_within_at 𝕜 f s x) :
2520+
fderiv_within 𝕜 (λ y, c y • f y) s x =
2521+
c x • fderiv_within 𝕜 f s x + (fderiv_within 𝕜 c s x).smul_algebra_right (f x) :=
2522+
(hc.has_fderiv_within_at.smul_algebra hf.has_fderiv_within_at).fderiv_within hxs
2523+
2524+
lemma fderiv_smul_algebra (hc : differentiable_at 𝕜 c x) (hf : differentiable_at 𝕜 f x) :
2525+
fderiv 𝕜 (λ y, c y • f y) x =
2526+
c x • fderiv 𝕜 f x + (fderiv 𝕜 c x).smul_algebra_right (f x) :=
2527+
(hc.has_fderiv_at.smul_algebra hf.has_fderiv_at).fderiv
2528+
2529+
theorem has_strict_fderiv_at.smul_algebra_const
2530+
(hc : has_strict_fderiv_at c c' x) (f : module.restrict_scalars 𝕜 𝕜' F) :
2531+
has_strict_fderiv_at (λ y, c y • f) (c'.smul_algebra_right f) x :=
2532+
by simpa only [smul_zero, zero_add] using hc.smul_algebra (has_strict_fderiv_at_const f x)
2533+
2534+
theorem has_fderiv_within_at.smul_algebra_const
2535+
(hc : has_fderiv_within_at c c' s x) (f : module.restrict_scalars 𝕜 𝕜' F) :
2536+
has_fderiv_within_at (λ y, c y • f) (c'.smul_algebra_right f) s x :=
2537+
by simpa only [smul_zero, zero_add] using hc.smul_algebra (has_fderiv_within_at_const f x s)
2538+
2539+
theorem has_fderiv_at.smul_algebra_const
2540+
(hc : has_fderiv_at c c' x) (f : module.restrict_scalars 𝕜 𝕜' F) :
2541+
has_fderiv_at (λ y, c y • f) (c'.smul_algebra_right f) x :=
2542+
by simpa only [smul_zero, zero_add] using hc.smul_algebra (has_fderiv_at_const f x)
2543+
2544+
lemma differentiable_within_at.smul_algebra_const
2545+
(hc : differentiable_within_at 𝕜 c s x) (f : module.restrict_scalars 𝕜 𝕜' F) :
2546+
differentiable_within_at 𝕜 (λ y, c y • f) s x :=
2547+
(hc.has_fderiv_within_at.smul_algebra_const f).differentiable_within_at
2548+
2549+
lemma differentiable_at.smul_algebra_const
2550+
(hc : differentiable_at 𝕜 c x) (f : module.restrict_scalars 𝕜 𝕜' F) :
2551+
differentiable_at 𝕜 (λ y, c y • f) x :=
2552+
(hc.has_fderiv_at.smul_algebra_const f).differentiable_at
2553+
2554+
lemma differentiable_on.smul_algebra_const
2555+
(hc : differentiable_on 𝕜 c s) (f : module.restrict_scalars 𝕜 𝕜' F) :
2556+
differentiable_on 𝕜 (λ y, c y • f) s :=
2557+
λx hx, (hc x hx).smul_algebra_const f
2558+
2559+
lemma differentiable.smul_algebra_const
2560+
(hc : differentiable 𝕜 c) (f : module.restrict_scalars 𝕜 𝕜' F) :
2561+
differentiable 𝕜 (λ y, c y • f) :=
2562+
λx, (hc x).smul_algebra_const f
2563+
2564+
lemma fderiv_within_smul_algebra_const (hxs : unique_diff_within_at 𝕜 s x)
2565+
(hc : differentiable_within_at 𝕜 c s x) (f : module.restrict_scalars 𝕜 𝕜' F) :
2566+
fderiv_within 𝕜 (λ y, c y • f) s x =
2567+
(fderiv_within 𝕜 c s x).smul_algebra_right f :=
2568+
(hc.has_fderiv_within_at.smul_algebra_const f).fderiv_within hxs
2569+
2570+
lemma fderiv_smul_algebra_const
2571+
(hc : differentiable_at 𝕜 c x) (f : module.restrict_scalars 𝕜 𝕜' F) :
2572+
fderiv 𝕜 (λ y, c y • f) x = (fderiv 𝕜 c x).smul_algebra_right f :=
2573+
(hc.has_fderiv_at.smul_algebra_const f).fderiv
2574+
2575+
theorem has_strict_fderiv_at.const_smul_algebra (h : has_strict_fderiv_at f f' x) (c : 𝕜') :
2576+
has_strict_fderiv_at (λ x, c • f x) (c • f') x :=
2577+
(c • (1 : (module.restrict_scalars 𝕜 𝕜' F) →L[𝕜] ((module.restrict_scalars 𝕜 𝕜' F))))
2578+
.has_strict_fderiv_at.comp x h
2579+
2580+
theorem has_fderiv_at_filter.const_smul_algebra (h : has_fderiv_at_filter f f' x L) (c : 𝕜') :
2581+
has_fderiv_at_filter (λ x, c • f x) (c • f') x L :=
2582+
(c • (1 : (module.restrict_scalars 𝕜 𝕜' F) →L[𝕜] ((module.restrict_scalars 𝕜 𝕜' F))))
2583+
.has_fderiv_at_filter.comp x h
2584+
2585+
theorem has_fderiv_within_at.const_smul_algebra (h : has_fderiv_within_at f f' s x) (c : 𝕜') :
2586+
has_fderiv_within_at (λ x, c • f x) (c • f') s x :=
2587+
h.const_smul_algebra c
2588+
2589+
theorem has_fderiv_at.const_smul_algebra (h : has_fderiv_at f f' x) (c : 𝕜') :
2590+
has_fderiv_at (λ x, c • f x) (c • f') x :=
2591+
h.const_smul_algebra c
2592+
2593+
lemma differentiable_within_at.const_smul_algebra (h : differentiable_within_at 𝕜 f s x) (c : 𝕜') :
2594+
differentiable_within_at 𝕜 (λy, c • f y) s x :=
2595+
(h.has_fderiv_within_at.const_smul_algebra c).differentiable_within_at
2596+
2597+
lemma differentiable_at.const_smul_algebra (h : differentiable_at 𝕜 f x) (c : 𝕜') :
2598+
differentiable_at 𝕜 (λy, c • f y) x :=
2599+
(h.has_fderiv_at.const_smul_algebra c).differentiable_at
2600+
2601+
lemma differentiable_on.const_smul_algebra (h : differentiable_on 𝕜 f s) (c : 𝕜') :
2602+
differentiable_on 𝕜 (λy, c • f y) s :=
2603+
λx hx, (h x hx).const_smul_algebra c
2604+
2605+
lemma differentiable.const_smul_algebra (h : differentiable 𝕜 f) (c : 𝕜') :
2606+
differentiable 𝕜 (λy, c • f y) :=
2607+
λx, (h x).const_smul_algebra c
2608+
2609+
lemma fderiv_within_const_smul_algebra (hxs : unique_diff_within_at 𝕜 s x)
2610+
(h : differentiable_within_at 𝕜 f s x) (c : 𝕜') :
2611+
fderiv_within 𝕜 (λy, c • f y) s x = c • fderiv_within 𝕜 f s x :=
2612+
(h.has_fderiv_within_at.const_smul_algebra c).fderiv_within hxs
2613+
2614+
lemma fderiv_const_smul_algebra (h : differentiable_at 𝕜 f x) (c : 𝕜') :
2615+
fderiv 𝕜 (λy, c • f y) x = c • fderiv 𝕜 f x :=
2616+
(h.has_fderiv_at.const_smul_algebra c).fderiv
2617+
2618+
end smul_algebra

src/analysis/complex/basic.lean

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,16 @@ finite_dimensional.proper ℂ E
7575
attribute [instance, priority 900] complex.finite_dimensional.proper
7676

7777
/-- A complex normed vector space is also a real normed vector space. -/
78+
@[priority 900]
7879
instance normed_space.restrict_scalars_real (E : Type*) [normed_group E] [normed_space ℂ E] :
79-
normed_space ℝ E := normed_space.restrict_scalars ℝ ℂ
80-
attribute [instance, priority 900] complex.normed_space.restrict_scalars_real
80+
normed_space ℝ E := normed_space.restrict_scalars' ℝ ℂ E
81+
82+
/-- The space of continuous linear maps over `ℝ`, from a real vector space to a complex vector
83+
space, is a normed vector space over `ℂ`. -/
84+
instance continuous_linear_map.real_smul_complex (E : Type*) [normed_group E] [normed_space ℝ E]
85+
(F : Type*) [normed_group F] [normed_space ℂ F] :
86+
normed_space ℂ (E →L[ℝ] F) :=
87+
continuous_linear_map.normed_space_extend_scalars
8188

8289
/-- Linear map version of the real part function, from `ℂ` to `ℝ`. -/
8390
def linear_map.re : ℂ →ₗ[ℝ] ℝ :=

src/analysis/normed_space/basic.lean

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -984,19 +984,30 @@ end normed_algebra
984984
section restrict_scalars
985985

986986
variables (𝕜 : Type*) (𝕜' : Type*) [normed_field 𝕜] [normed_field 𝕜'] [normed_algebra 𝕜 𝕜']
987-
{E : Type*} [normed_group E] [normed_space 𝕜' E]
987+
(E : Type*) [normed_group E] [normed_space 𝕜' E]
988988

989989
/-- `𝕜`-normed space structure induced by a `𝕜'`-normed space structure when `𝕜'` is a
990-
normed algebra over `𝕜`. Not registered as an instance as `𝕜'` can not be inferred. -/
991-
-- We could add a type synonym equipped with this as an instance,
992-
-- as we've done for `module.restrict_scalars`.
993-
def normed_space.restrict_scalars : normed_space 𝕜 E :=
990+
normed algebra over `𝕜`. Not registered as an instance as `𝕜'` can not be inferred.
991+
992+
The type synonym `module.restrict_scalars 𝕜 𝕜' E` will be endowed with this instance by default.
993+
-/
994+
def normed_space.restrict_scalars' : normed_space 𝕜 E :=
994995
{ norm_smul_le := λc x, le_of_eq $ begin
995996
change ∥(algebra_map 𝕜 𝕜' c) • x∥ = ∥c∥ * ∥x∥,
996997
simp [norm_smul]
997998
end,
998999
..module.restrict_scalars' 𝕜 𝕜' E }
9991000

1001+
instance {𝕜 : Type*} {𝕜' : Type*} {E : Type*} [I : normed_group E] :
1002+
normed_group (module.restrict_scalars 𝕜 𝕜' E) := I
1003+
1004+
instance module.restrict_scalars.normed_space_orig {𝕜 : Type*} {𝕜' : Type*} {E : Type*}
1005+
[normed_field 𝕜'] [normed_group E] [I : normed_space 𝕜' E] :
1006+
normed_space 𝕜' (module.restrict_scalars 𝕜 𝕜' E) := I
1007+
1008+
instance : normed_space 𝕜 (module.restrict_scalars 𝕜 𝕜' E) :=
1009+
(normed_space.restrict_scalars' 𝕜 𝕜' E : normed_space 𝕜 E)
1010+
10001011
end restrict_scalars
10011012

10021013
section summable

src/analysis/normed_space/bounded_linear_maps.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,15 @@ lemma is_bounded_bilinear_map_smul :
278278
smul_right := λc x y, by simp [smul_smul, mul_comm],
279279
bound := ⟨1, zero_lt_one, λx y, by simp [norm_smul]⟩ }
280280

281+
lemma is_bounded_bilinear_map_smul_algebra {𝕜' : Type*} [normed_field 𝕜']
282+
[normed_algebra 𝕜 𝕜'] {E : Type*} [normed_group E] [normed_space 𝕜' E] :
283+
is_bounded_bilinear_map 𝕜 (λ (p : 𝕜' × (module.restrict_scalars 𝕜 𝕜' E)), p.1 • p.2) :=
284+
{ add_left := add_smul,
285+
smul_left := λ c x y, by simp [smul_algebra_smul],
286+
add_right := smul_add,
287+
smul_right := λ c x y, by simp [smul_algebra_smul, smul_algebra_smul_comm],
288+
bound := ⟨1, zero_lt_one, λ x y, by simp [norm_smul] ⟩ }
289+
281290
lemma is_bounded_bilinear_map_mul :
282291
is_bounded_bilinear_map 𝕜 (λ (p : 𝕜 × 𝕜), p.1 * p.2) :=
283292
is_bounded_bilinear_map_smul

src/analysis/normed_space/hahn_banach.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ variables {F : Type*} [normed_group F] [normed_space ℂ F]
5252
-- Inlining the following two definitions causes a type mismatch between
5353
-- subspace ℝ (module.restrict_scalars ℝ ℂ F) and subspace ℂ F.
5454
/-- Restrict a ℂ-subspace to an ℝ-subspace. -/
55-
noncomputable def restrict_scalars (p: subspace ℂ F) : subspace ℝ F := p.restrict_scalars ℝ ℂ F
55+
noncomputable def restrict_scalars (p : subspace ℂ F) : subspace ℝ F := p.restrict_scalars ℝ ℂ F
5656

5757
private lemma apply_real (p : subspace ℂ F) (f' : p →L[ℝ] ℝ) :
5858
∃ g : F →L[ℝ] ℝ, (∀ x : restrict_scalars p, g x = f' x) ∧ ∥g∥ = ∥f'∥ :=

src/analysis/normed_space/operator_norm.lean

Lines changed: 62 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,16 @@ end uniformly_extend
581581

582582
end op_norm
583583

584+
end continuous_linear_map
585+
586+
/-- If a continuous linear map is constructed from a linear map via the constructor `mk_continuous`,
587+
then its norm is bounded by the bound given to the constructor if it is nonnegative. -/
588+
lemma linear_map.mk_continuous_norm_le (f : E →ₗ[𝕜] F) {C : ℝ} (hC : 0 ≤ C) (h : ∀x, ∥f x∥ ≤ C * ∥x∥) :
589+
∥f.mk_continuous C h∥ ≤ C :=
590+
continuous_linear_map.op_norm_le_bound _ hC h
591+
592+
namespace continuous_linear_map
593+
584594
/-- The norm of the tensor product of a scalar linear map and of an element of a normed space
585595
is the product of the norms. -/
586596
@[simp] lemma smul_right_norm {c : E →L[𝕜] 𝕜} {f : F} :
@@ -636,38 +646,82 @@ variables {𝕜' : Type*} [normed_field 𝕜'] [normed_algebra 𝕜 𝕜']
636646
{E' : Type*} [normed_group E'] [normed_space 𝕜' E']
637647
{F' : Type*} [normed_group F'] [normed_space 𝕜' F']
638648

639-
local attribute [instance, priority 500] normed_space.restrict_scalars
640-
641649
/-- `𝕜`-linear continuous function induced by a `𝕜'`-linear continuous function when `𝕜'` is a
642650
normed algebra over `𝕜`. -/
643-
def restrict_scalars (f : E' →L[𝕜'] F') : E' →L[𝕜] F' :=
651+
def restrict_scalars (f : E' →L[𝕜'] F') :
652+
(module.restrict_scalars 𝕜 𝕜' E') →L[𝕜] (module.restrict_scalars 𝕜 𝕜' F') :=
644653
{ cont := f.cont,
645654
..linear_map.restrict_scalars 𝕜 (f.to_linear_map) }
646655

647656
@[simp, norm_cast] lemma restrict_scalars_coe_eq_coe (f : E' →L[𝕜'] F') :
648-
(f.restrict_scalars 𝕜 : E' →ₗ[𝕜] F') = (f : E' →ₗ[𝕜'] F').restrict_scalars 𝕜 := rfl
657+
(f.restrict_scalars 𝕜 :
658+
(module.restrict_scalars 𝕜 𝕜' E') →ₗ[𝕜] (module.restrict_scalars 𝕜 𝕜' F')) =
659+
(f : E' →ₗ[𝕜'] F').restrict_scalars 𝕜 := rfl
649660

650661
@[simp, norm_cast squash] lemma restrict_scalars_coe_eq_coe' (f : E' →L[𝕜'] F') :
651662
(f.restrict_scalars 𝕜 : E' → F') = f := rfl
652663

653664
end restrict_scalars
654665

655-
end continuous_linear_map
666+
section extend_scalars
667+
668+
variables {𝕜' : Type*} [normed_field 𝕜'] [normed_algebra 𝕜 𝕜']
669+
{F' : Type*} [normed_group F'] [normed_space 𝕜' F']
670+
671+
instance has_scalar_extend_scalars : has_scalar 𝕜' (E →L[𝕜] (module.restrict_scalars 𝕜 𝕜' F')) :=
672+
{ smul := λ c f, (c • f.to_linear_map).mk_continuous (∥c∥ * ∥f∥)
673+
begin
674+
assume x,
675+
calc ∥c • (f x)∥ = ∥c∥ * ∥f x∥ : norm_smul c _
676+
... ≤ ∥c∥ * (∥f∥ * ∥x∥) : mul_le_mul_of_nonneg_left (le_op_norm f x) (norm_nonneg _)
677+
... = ∥c∥ * ∥f∥ * ∥x∥ : (mul_assoc _ _ _).symm
678+
end }
679+
680+
instance module_extend_scalars : module 𝕜' (E →L[𝕜] (module.restrict_scalars 𝕜 𝕜' F')) :=
681+
{ smul_zero := λ _, ext $ λ _, smul_zero _,
682+
zero_smul := λ _, ext $ λ _, zero_smul _ _,
683+
one_smul := λ _, ext $ λ _, one_smul _ _,
684+
mul_smul := λ _ _ _, ext $ λ _, mul_smul _ _ _,
685+
add_smul := λ _ _ _, ext $ λ _, add_smul _ _ _,
686+
smul_add := λ _ _ _, ext $ λ _, smul_add _ _ _ }
687+
688+
instance normed_space_extend_scalars : normed_space 𝕜' (E →L[𝕜] (module.restrict_scalars 𝕜 𝕜' F')) :=
689+
{ norm_smul_le := λ c f,
690+
linear_map.mk_continuous_norm_le _ (mul_nonneg (norm_nonneg _) (norm_nonneg _)) _ }
691+
692+
/-- When `f` is a continuous linear map taking values in `S`, then `λb, f b • x` is a
693+
continuous linear map. -/
694+
def smul_algebra_right (f : E →L[𝕜] 𝕜') (x : module.restrict_scalars 𝕜 𝕜' F') :
695+
E →L[𝕜] (module.restrict_scalars 𝕜 𝕜' F') :=
696+
{ cont := by continuity!,
697+
.. smul_algebra_right f.to_linear_map x }
698+
699+
@[simp] theorem smul_algebra_right_apply
700+
(f : E →L[𝕜] 𝕜') (x : module.restrict_scalars 𝕜 𝕜' F') (c : E) :
701+
smul_algebra_right f x c = f c • x := rfl
702+
703+
end extend_scalars
704+
705+
section has_sum
656706

657707
variables {ι : Type*}
658708

659709
/-- Applying a continuous linear map commutes with taking an (infinite) sum. -/
660-
lemma continuous_linear_map.has_sum {f : ι → E} (φ : E →L[𝕜] F) {x : E} (hf : has_sum f x) :
710+
protected lemma has_sum {f : ι → E} (φ : E →L[𝕜] F) {x : E} (hf : has_sum f x) :
661711
has_sum (λ (b:ι), φ (f b)) (φ x) :=
662712
begin
663713
unfold has_sum,
664714
convert φ.continuous.continuous_at.tendsto.comp hf,
665715
ext s, rw [function.comp_app, finset.sum_hom s φ],
666716
end
667717

668-
lemma continuous_linear_map.has_sum_of_summable {f : ι → E} (φ : E →L[𝕜] F) (hf : summable f) :
718+
lemma has_sum_of_summable {f : ι → E} (φ : E →L[𝕜] F) (hf : summable f) :
669719
has_sum (λ (b:ι), φ (f b)) (φ (∑'b, f b)) :=
670-
continuous_linear_map.has_sum φ hf.has_sum
720+
φ.has_sum hf.has_sum
721+
722+
end has_sum
723+
724+
end continuous_linear_map
671725

672726
namespace continuous_linear_equiv
673727

@@ -832,12 +886,6 @@ continuous_linear_equiv.uniform_embedding
832886
continuous_inv_fun := h₂,
833887
.. e }
834888

835-
/-- If a continuous linear map is constructed from a linear map via the constructor `mk_continuous`,
836-
then its norm is bounded by the bound given to the constructor if it is nonnegative. -/
837-
lemma linear_map.mk_continuous_norm_le (f : E →ₗ[𝕜] F) {C : ℝ} (hC : 0 ≤ C) (h : ∀x, ∥f x∥ ≤ C * ∥x∥) :
838-
∥f.mk_continuous C h∥ ≤ C :=
839-
continuous_linear_map.op_norm_le_bound _ hC h
840-
841889
namespace continuous_linear_map
842890
variables (𝕜) (𝕜' : Type*) [normed_ring 𝕜'] [normed_algebra 𝕜 𝕜']
843891

src/data/complex/module.lean

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ Authors: Alexander Bentkamp, Sébastien Gouëzel
66
import data.complex.basic
77
import ring_theory.algebra
88
/-!
9-
This file contains two instance, the fact the ℂ is an ℝ algebra,
10-
and an instance to view any complex vector space as a
11-
real vector space
9+
This file contains three instances:
10+
* `ℂ` is an `ℝ` algebra;
11+
* any complex vector space is a real vector space;
12+
* the space of `ℝ`-linear maps from a real vector space to a complex vector space is a complex
13+
vector space.
1214
-/
1315
noncomputable theory
1416

@@ -23,3 +25,7 @@ vector space. -/
2325
instance module.complex_to_real (E : Type*) [add_comm_group E] [module ℂ E] : module ℝ E :=
2426
module.restrict_scalars' ℝ ℂ E
2527
attribute [instance, priority 900] module.complex_to_real
28+
29+
instance (E : Type*) [add_comm_group E] [module ℝ E]
30+
(F : Type*) [add_comm_group F] [module ℂ F] : module ℂ (E →ₗ[ℝ] F) :=
31+
linear_map.module_extend_scalars _ _ _ _

0 commit comments

Comments
 (0)