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

Commit de83b43

Browse files
committed
feat(analysis/normed_space/lp_space): generalize from normed_field to normed_ring (#19085)
This provides a `module 𝕜 (lp E p)` instance for `normed_ring 𝕜` instead of `normed_field 𝕜`, as we didn't actually require that the bound on the norm of the scalar action was tight.
1 parent 6480bed commit de83b43

1 file changed

Lines changed: 91 additions & 41 deletions

File tree

src/analysis/normed_space/lp_space.lean

Lines changed: 91 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -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))), },
249249
end
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

255255
lemma const_smul {f : Π i, E i} (hf : mem_ℓp f p) (c : 𝕜) : mem_ℓp (c • f) p :=
256256
begin
@@ -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), },
269273
end
270274

271275
lemma 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

276280
end 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

563567
end 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

569574
instance : 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+
571588
lemma 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‖ :=
592619
begin
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 }
610648
end
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‖ :=
622660
begin
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,
626666
end
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+
628676
end normed_space
629677

630678
section 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

673721
instance : 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 ∞) :=
847897
end algebra
848898

849899
section 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)]
851901
variables [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

Comments
 (0)