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

Commit e73ac94

Browse files
feat (analysis/normed_space/lp_space):add l_infinity ring instances (#14104)
We define pointwise multiplication on `lp E ∞` and give it has_mul, non_unital_ring, non_unital_normed_ring, ring, normed_ring, comm_ring and normed_comm_ring instances under the appropriate assumptions. Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
1 parent ce332c1 commit e73ac94

File tree

1 file changed

+115
-3
lines changed

1 file changed

+115
-3
lines changed

src/analysis/normed_space/lp_space.lean

Lines changed: 115 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@ The space `lp E p` is the subtype of elements of `Π i : α, E i` which satisfy
2626
2727
* `mem_ℓp f p` : property that the function `f` satisfies, as appropriate, `f` finitely supported
2828
if `p = 0`, `summable (λ a, ∥f a∥^p)` if `0 < p < ∞`, and `bdd_above (norm '' (set.range f))` if
29-
`p = ∞`
29+
`p = ∞`.
3030
* `lp E p` : elements of `Π i : α, E i` such that `mem_ℓp f p`. Defined as an `add_subgroup` of
31-
a type synonym `pre_lp` for `Π i : α, E i`, and equipped with a `normed_group` structure; also
32-
equipped with `normed_space 𝕜` and `complete_space` instances under appropriate conditions
31+
a type synonym `pre_lp` for `Π i : α, E i`, and equipped with a `normed_group` structure.
32+
Under appropriate conditions, this is also equipped with the instances `lp.normed_space`,
33+
`lp.complete_space`, and `lp.normed_ring`.
3334
3435
## Main results
3536
@@ -628,6 +629,117 @@ end
628629

629630
end normed_space
630631

632+
section non_unital_normed_ring
633+
634+
variables {I : Type*} {B : I → Type*} [Π i, non_unital_normed_ring (B i)]
635+
636+
lemma _root_.mem_ℓp.infty_mul {f g : Π i, B i} (hf : mem_ℓp f ∞) (hg : mem_ℓp g ∞) :
637+
mem_ℓp (f * g) ∞ :=
638+
begin
639+
rw mem_ℓp_infty_iff,
640+
obtain ⟨⟨Cf, hCf⟩, ⟨Cg, hCg⟩⟩ := ⟨hf.bdd_above, hg.bdd_above⟩,
641+
refine ⟨Cf * Cg, _⟩,
642+
rintros _ ⟨i, rfl⟩,
643+
calc ∥(f * g) i∥ ≤ ∥f i∥ * ∥g i∥ : norm_mul_le (f i) (g i)
644+
... ≤ Cf * Cg : mul_le_mul (hCf ⟨i, rfl⟩) (hCg ⟨i, rfl⟩) (norm_nonneg _)
645+
((norm_nonneg _).trans (hCf ⟨i, rfl⟩))
646+
end
647+
648+
instance : has_mul (lp B ∞) :=
649+
{ mul := λ f g, ⟨(f * g : Π i, B i) , f.property.infty_mul g.property⟩}
650+
651+
@[simp] lemma infty_coe_fn_mul (f g : lp B ∞) : ⇑(f * g) = f * g := rfl
652+
653+
instance : non_unital_ring (lp B ∞) :=
654+
function.injective.non_unital_ring lp.has_coe_to_fun.coe (subtype.coe_injective)
655+
(lp.coe_fn_zero B ∞) lp.coe_fn_add infty_coe_fn_mul lp.coe_fn_neg lp.coe_fn_sub
656+
(λ _ _, rfl) (λ _ _,rfl)
657+
658+
instance : non_unital_normed_ring (lp B ∞) :=
659+
{ norm_mul := λ f g, lp.norm_le_of_forall_le (mul_nonneg (norm_nonneg f) (norm_nonneg g))
660+
(λ i, calc ∥(f * g) i∥ ≤ ∥f i∥ * ∥g i∥ : norm_mul_le _ _
661+
... ≤ ∥f∥ * ∥g∥
662+
: mul_le_mul (lp.norm_apply_le_norm ennreal.top_ne_zero f i)
663+
(lp.norm_apply_le_norm ennreal.top_ne_zero g i) (norm_nonneg _) (norm_nonneg _)),
664+
.. lp.normed_group }
665+
666+
-- we also want a `non_unital_normed_comm_ring` instance, but this has to wait for #13719
667+
668+
end non_unital_normed_ring
669+
670+
section normed_ring
671+
672+
variables {I : Type*} {B : I → Type*} [Π i, normed_ring (B i)] [Π i, norm_one_class (B i)]
673+
674+
lemma _root_.one_mem_ℓp_infty : mem_ℓp (1 : Π i, B i) ∞ :=
675+
1, by { rintros i ⟨i, rfl⟩, exact norm_one.le,}⟩
676+
677+
instance : has_one (lp B ∞) :=
678+
{ one := ⟨(1 : Π i, B i), one_mem_ℓp_infty⟩ }
679+
680+
@[simp] lemma infty_coe_fn_one : ⇑(1 : lp B ∞) = 1 := rfl
681+
682+
lemma _root_.mem_ℓp.infty_pow {f : Π i, B i} (hf : mem_ℓp f ∞) (n : ℕ) : mem_ℓp (f ^ n) ∞ :=
683+
begin
684+
induction n with n hn,
685+
{ rw pow_zero,
686+
exact one_mem_ℓp_infty },
687+
{ rw pow_succ,
688+
exact hf.infty_mul hn }
689+
end
690+
691+
instance [nonempty I] : norm_one_class (lp B ∞) :=
692+
{ norm_one := by simp_rw [lp.norm_eq_csupr, infty_coe_fn_one, pi.one_apply, norm_one, csupr_const]}
693+
694+
instance : has_pow (lp B ∞) ℕ := { pow := λ f n, ⟨_, f.prop.infty_pow n⟩ }
695+
696+
@[simp] lemma infty_coe_fn_pow (f : lp B ∞) (n : ℕ) : ⇑(f ^ n) = f ^ n := rfl
697+
698+
lemma _root_.nat_cast_mem_ℓp_infty : ∀ (n : ℕ), mem_ℓp (n : Π i, B i) ∞
699+
| 0 := by { rw nat.cast_zero, exact zero_mem_ℓp }
700+
| (n + 1) := by { rw nat.cast_succ, exact (_root_.nat_cast_mem_ℓp_infty n).add one_mem_ℓp_infty }
701+
702+
instance : has_nat_cast (lp B ∞) := { nat_cast := λ n, ⟨(↑n : Π i, B i), nat_cast_mem_ℓp_infty _⟩ }
703+
704+
@[simp] lemma infty_coe_fn_nat_cast (n : ℕ) : ⇑(n : lp B ∞) = n := rfl
705+
706+
lemma _root_.int_cast_mem_ℓp_infty (z : ℤ) : mem_ℓp (z : Π i, B i) ∞ :=
707+
begin
708+
obtain ⟨n, rfl | rfl⟩ := z.eq_coe_or_neg,
709+
{ rw int.cast_coe_nat,
710+
exact nat_cast_mem_ℓp_infty n },
711+
{ rw [int.cast_neg, int.cast_coe_nat],
712+
exact (nat_cast_mem_ℓp_infty n).neg }
713+
end
714+
715+
instance : has_int_cast (lp B ∞) := { int_cast := λ z, ⟨(↑z : Π i, B i), int_cast_mem_ℓp_infty _⟩ }
716+
717+
@[simp] lemma infty_coe_fn_int_cast (z : ℤ) : ⇑(z : lp B ∞) = z := rfl
718+
719+
instance : ring (lp B ∞) :=
720+
function.injective.ring lp.has_coe_to_fun.coe subtype.coe_injective
721+
(lp.coe_fn_zero B ∞) (infty_coe_fn_one) lp.coe_fn_add infty_coe_fn_mul
722+
lp.coe_fn_neg lp.coe_fn_sub (λ _ _, rfl) (λ _ _, rfl) infty_coe_fn_pow
723+
infty_coe_fn_nat_cast infty_coe_fn_int_cast
724+
725+
instance : normed_ring (lp B ∞) :=
726+
{ .. lp.ring, .. lp.non_unital_normed_ring }
727+
728+
end normed_ring
729+
730+
section normed_comm_ring
731+
732+
variables {I : Type*} {B : I → Type*} [Π i, normed_comm_ring (B i)] [∀ i, norm_one_class (B i)]
733+
734+
instance : comm_ring (lp B ∞) :=
735+
{ mul_comm := λ f g, by { ext, simp only [lp.infty_coe_fn_mul, pi.mul_apply, mul_comm] },
736+
.. lp.ring }
737+
738+
instance : normed_comm_ring (lp B ∞) :=
739+
{ .. lp.comm_ring, .. lp.normed_ring }
740+
741+
end normed_comm_ring
742+
631743
section single
632744
variables {𝕜 : Type*} [normed_field 𝕜] [Π i, normed_space 𝕜 (E i)]
633745
variables [decidable_eq α]

0 commit comments

Comments
 (0)