@@ -248,9 +248,9 @@ begin
248248 exact (hf i (s.mem_insert_self i)).add (ih (λ j hj, hf j (finset.mem_insert_of_mem hj))), },
249249end
250250
251- section normed_space
251+ section has_bounded_smul
252252
253- variables {𝕜 : Type *} [normed_field 𝕜] [Π i, normed_space 𝕜 (E i)]
253+ variables {𝕜 : Type *} [normed_ring 𝕜] [Π i, module 𝕜 (E i)] [∀ i, has_bounded_smul 𝕜 (E i)]
254254
255255lemma const_smul {f : Π i, E i} (hf : mem_ℓp f p) (c : 𝕜) : mem_ℓp (c • f) p :=
256256begin
@@ -261,17 +261,21 @@ begin
261261 { obtain ⟨A, hA⟩ := hf.bdd_above,
262262 refine mem_ℓp_infty ⟨‖c‖ * A, _⟩,
263263 rintros a ⟨i, rfl⟩,
264- simpa [norm_smul] using mul_le_mul_of_nonneg_left (hA ⟨i, rfl⟩) (norm_nonneg c) },
264+ refine (norm_smul_le _ _).trans _,
265+ exact mul_le_mul_of_nonneg_left (hA ⟨i, rfl⟩) (norm_nonneg c) },
265266 { apply mem_ℓp_gen,
266- convert (hf.summable hp).mul_left (‖c‖ ^ p.to_real),
267- ext i,
268- simp [norm_smul, real.mul_rpow (norm_nonneg c) (norm_nonneg (f i))] },
267+ have := (hf.summable hp).mul_left (↑(‖c‖₊ ^ p.to_real) : ℝ),
268+ simp_rw [← coe_nnnorm, ←nnreal.coe_rpow, ←nnreal.coe_mul, nnreal.summable_coe,
269+ ←nnreal.mul_rpow] at this ⊢,
270+ refine nnreal.summable_of_le _ this ,
271+ intro i,
272+ exact nnreal.rpow_le_rpow (nnnorm_smul_le _ _) (ennreal.to_real_nonneg), },
269273end
270274
271275lemma const_mul {f : α → 𝕜} (hf : mem_ℓp f p) (c : 𝕜) : mem_ℓp (λ x, c * f x) p :=
272- @mem_ℓp.const_smul α (λ i, 𝕜) _ _ 𝕜 _ _ _ hf c
276+ @mem_ℓp.const_smul α (λ i, 𝕜) _ _ 𝕜 _ _ (λ i, by apply_instance) _ hf c
273277
274- end normed_space
278+ end has_bounded_smul
275279
276280end mem_ℓp
277281
@@ -562,12 +566,25 @@ norm_le_of_tsum_le hp hC (tsum_le_of_sum_le ((lp.mem_ℓp f).summable hp) hf)
562566
563567end compare_pointwise
564568
565- section normed_space
566-
567- variables {𝕜 : Type *} [normed_field 𝕜] [Π i, normed_space 𝕜 (E i)]
569+ section has_bounded_smul
570+ variables {𝕜 : Type *} {𝕜' : Type *}
571+ variables [normed_ring 𝕜] [normed_ring 𝕜']
572+ variables [Π i, module 𝕜 (E i)] [Π i, module 𝕜' (E i)]
568573
569574instance : module 𝕜 (pre_lp E) := pi.module α E 𝕜
570575
576+ instance [Π i, smul_comm_class 𝕜' 𝕜 (E i)] : smul_comm_class 𝕜' 𝕜 (pre_lp E) :=
577+ pi.smul_comm_class
578+
579+ instance [has_smul 𝕜' 𝕜] [Π i, is_scalar_tower 𝕜' 𝕜 (E i)] : is_scalar_tower 𝕜' 𝕜 (pre_lp E) :=
580+ pi.is_scalar_tower
581+
582+ instance [Π i, module 𝕜ᵐᵒᵖ (E i)] [Π i, is_central_scalar 𝕜 (E i)] :
583+ is_central_scalar 𝕜 (pre_lp E) :=
584+ pi.is_central_scalar
585+
586+ variables [∀ i, has_bounded_smul 𝕜 (E i)] [∀ i, has_bounded_smul 𝕜' (E i)]
587+
571588lemma mem_lp_const_smul (c : 𝕜) (f : lp E p) : c • (f : pre_lp E) ∈ lp E p :=
572589(lp.mem_ℓp f).const_smul c
573590
@@ -588,43 +605,74 @@ instance : module 𝕜 (lp E p) :=
588605
589606@[simp] lemma coe_fn_smul (c : 𝕜) (f : lp E p) : ⇑(c • f) = c • f := rfl
590607
591- lemma norm_const_smul (hp : p ≠ 0 ) {c : 𝕜} (f : lp E p) : ‖c • f‖ = ‖c‖ * ‖f‖ :=
608+ instance [Π i, smul_comm_class 𝕜' 𝕜 (E i)] : smul_comm_class 𝕜' 𝕜 (lp E p) :=
609+ ⟨λ r c f, subtype.ext $ smul_comm _ _ _⟩
610+
611+ instance [has_smul 𝕜' 𝕜] [Π i, is_scalar_tower 𝕜' 𝕜 (E i)] : is_scalar_tower 𝕜' 𝕜 (lp E p) :=
612+ ⟨λ r c f, subtype.ext $ smul_assoc _ _ _⟩
613+
614+ instance [Π i, module 𝕜ᵐᵒᵖ (E i)] [Π i, is_central_scalar 𝕜 (E i)] :
615+ is_central_scalar 𝕜 (lp E p) :=
616+ ⟨λ r f, subtype.ext $ op_smul_eq_smul _ _⟩
617+
618+ lemma norm_const_smul_le (hp : p ≠ 0 ) (c : 𝕜) (f : lp E p) : ‖c • f‖ ≤ ‖c‖ * ‖f‖ :=
592619begin
593620 rcases p.trichotomy with rfl | rfl | hp,
594621 { exact absurd rfl hp },
595622 { cases is_empty_or_nonempty α; resetI,
596623 { simp [lp.eq_zero' f], },
597- apply (lp.is_lub_norm (c • f)).unique,
598- convert (lp.is_lub_norm f).mul_left (norm_nonneg c),
599- ext a,
600- simp [coe_fn_smul, norm_smul] },
601- { suffices : ‖c • f‖ ^ p.to_real = (‖c‖ * ‖f‖) ^ p.to_real,
602- { refine real.rpow_left_inj_on hp.ne' _ _ this ,
603- { exact norm_nonneg' _ },
604- { exact mul_nonneg (norm_nonneg _) (norm_nonneg' _) } },
605- apply (lp.has_sum_norm hp (c • f)).unique,
606- convert (lp.has_sum_norm hp f).mul_left (‖c‖ ^ p.to_real),
607- { simp [coe_fn_smul, norm_smul, real.mul_rpow (norm_nonneg c) (norm_nonneg _)] },
608- have hf : 0 ≤ ‖f‖ := lp.norm_nonneg' f,
609- simp [coe_fn_smul, norm_smul, real.mul_rpow (norm_nonneg c) hf] }
624+ have hcf := lp.is_lub_norm (c • f),
625+ have hfc := (lp.is_lub_norm f).mul_left (norm_nonneg c),
626+ simp_rw [←set.range_comp, function.comp] at hfc,
627+ -- TODO: some `is_lub` API should make it a one-liner from here.
628+ refine hcf.right _,
629+ have := hfc.left,
630+ simp_rw [mem_upper_bounds, set.mem_range, forall_exists_index,
631+ forall_apply_eq_imp_iff'] at this ⊢,
632+ intro a,
633+ exact (norm_smul_le _ _).trans (this a) },
634+ { letI inst : has_nnnorm (lp E p) := ⟨λ f, ⟨‖f‖, norm_nonneg' _⟩⟩,
635+ have coe_nnnorm : ∀ f : lp E p, ↑‖f‖₊ = ‖f‖ := λ _, rfl,
636+ suffices : ‖c • f‖₊ ^ p.to_real ≤ (‖c‖₊ * ‖f‖₊) ^ p.to_real,
637+ { rwa nnreal.rpow_le_rpow_iff hp at this },
638+ unfreezingI { clear_value inst },
639+ rw [nnreal.mul_rpow],
640+ have hLHS := (lp.has_sum_norm hp (c • f)),
641+ have hRHS := (lp.has_sum_norm hp f).mul_left (‖c‖ ^ p.to_real),
642+ simp_rw [←coe_nnnorm, ←_root_.coe_nnnorm, ←nnreal.coe_rpow, ←nnreal.coe_mul,
643+ nnreal.has_sum_coe] at hRHS hLHS,
644+ refine has_sum_mono hLHS hRHS (λ i, _),
645+ dsimp only,
646+ rw [←nnreal.mul_rpow],
647+ exact nnreal.rpow_le_rpow (nnnorm_smul_le _ _) ennreal.to_real_nonneg }
610648end
611649
612- instance [fact (1 ≤ p)] : normed_space 𝕜 (lp E p) :=
613- { norm_smul_le := λ c f, begin
614- have hp : 0 < p := zero_lt_one.trans_le (fact.out _),
615- simp [norm_const_smul hp.ne']
616- end }
650+ instance [fact (1 ≤ p)] : has_bounded_smul 𝕜 (lp E p) :=
651+ has_bounded_smul.of_norm_smul_le $ norm_const_smul_le (zero_lt_one.trans_le $ fact.out (1 ≤ p)).ne'
652+
653+ end has_bounded_smul
617654
618- variables {𝕜' : Type *} [normed_field 𝕜']
655+ section division_ring
656+ variables {𝕜 : Type *}
657+ variables [normed_division_ring 𝕜] [Π i, module 𝕜 (E i)] [∀ i, has_bounded_smul 𝕜 (E i)]
619658
620- instance [Π i, normed_space 𝕜' (E i)] [has_smul 𝕜' 𝕜] [Π i, is_scalar_tower 𝕜' 𝕜 (E i)] :
621- is_scalar_tower 𝕜' 𝕜 (lp E p) :=
659+ lemma norm_const_smul (hp : p ≠ 0 ) {c : 𝕜} (f : lp E p) : ‖c • f‖ = ‖c‖ * ‖f‖ :=
622660begin
623- refine ⟨λ r c f, _⟩,
624- ext1,
625- exact (lp.coe_fn_smul _ _).trans (smul_assoc _ _ _)
661+ obtain rfl | hc := eq_or_ne c 0 ,
662+ { simp },
663+ refine le_antisymm (norm_const_smul_le hp c f) _,
664+ have := mul_le_mul_of_nonneg_left (norm_const_smul_le hp c⁻¹ (c • f)) (norm_nonneg c),
665+ rwa [inv_smul_smul₀ hc, norm_inv, mul_inv_cancel_left₀ (norm_ne_zero_iff.mpr hc)] at this ,
626666end
627667
668+ end division_ring
669+
670+ section normed_space
671+ variables {𝕜 : Type *} [normed_field 𝕜] [Π i, normed_space 𝕜 (E i)]
672+
673+ instance [fact (1 ≤ p)] : normed_space 𝕜 (lp E p) :=
674+ { norm_smul_le := λ c f, norm_smul_le _ _}
675+
628676end normed_space
629677
630678section normed_star_group
@@ -667,8 +715,8 @@ instance [hp : fact (1 ≤ p)] : normed_star_group (lp E p) :=
667715 { simp only [lp.norm_eq_tsum_rpow h, lp.star_apply, norm_star] }
668716 end }
669717
670- variables {𝕜 : Type *} [has_star 𝕜] [normed_field 𝕜]
671- variables [Π i, normed_space 𝕜 (E i)] [Π i, star_module 𝕜 (E i)]
718+ variables {𝕜 : Type *} [has_star 𝕜] [normed_ring 𝕜]
719+ variables [Π i, module 𝕜 (E i)] [∀ i, has_bounded_smul 𝕜 (E i)] [Π i, star_module 𝕜 (E i)]
672720
673721instance : star_module 𝕜 (lp E p) := { star_smul := λ r f, ext $ star_smul _ _ }
674722
@@ -710,12 +758,14 @@ instance : non_unital_normed_ring (lp B ∞) :=
710758
711759-- we also want a `non_unital_normed_comm_ring` instance, but this has to wait for #13719
712760
713- instance infty_is_scalar_tower {𝕜} [normed_field 𝕜] [Π i, normed_space 𝕜 (B i)]
761+ instance infty_is_scalar_tower
762+ {𝕜} [normed_ring 𝕜] [Π i, module 𝕜 (B i)] [∀ i, has_bounded_smul 𝕜 (B i)]
714763 [Π i, is_scalar_tower 𝕜 (B i) (B i)] :
715764 is_scalar_tower 𝕜 (lp B ∞) (lp B ∞) :=
716765⟨λ r f g, lp.ext $ smul_assoc r ⇑f ⇑g⟩
717766
718- instance infty_smul_comm_class {𝕜} [normed_field 𝕜] [Π i, normed_space 𝕜 (B i)]
767+ instance infty_smul_comm_class
768+ {𝕜} [normed_ring 𝕜] [Π i, module 𝕜 (B i)] [∀ i, has_bounded_smul 𝕜 (B i)]
719769 [Π i, smul_comm_class 𝕜 (B i) (B i)] :
720770 smul_comm_class 𝕜 (lp B ∞) (lp B ∞) :=
721771⟨λ r f g, lp.ext $ smul_comm r ⇑f ⇑g⟩
@@ -847,7 +897,7 @@ instance infty_normed_algebra : normed_algebra 𝕜 (lp B ∞) :=
847897end algebra
848898
849899section single
850- variables {𝕜 : Type *} [normed_field 𝕜] [Π i, normed_space 𝕜 (E i)]
900+ variables {𝕜 : Type *} [normed_ring 𝕜] [Π i, module 𝕜 (E i)] [∀ i, has_bounded_smul 𝕜 (E i)]
851901variables [decidable_eq α]
852902
853903/-- The element of `lp E p` which is `a : E i` at the index `i`, and zero elsewhere. -/
0 commit comments