Skip to content

Commit bf997ce

Browse files
committed
feat(Analysis/Normed): generalize smul on cts [multi-]linear maps (#33962)
Allow scalar multiplication by more general types (not just normed fields) that act reasonably on the target of the map. Mostly this just involves swapping typeclass assumptions, but the file `Mathlib/Analysis/Normed/Operator/BoundedLinearMaps.lean` needed a more intensive refactor to separate out the results that are valid over a general base ring from those that really require a `NontriviallyNormedField`.
1 parent 1efe6ae commit bf997ce

File tree

7 files changed

+212
-150
lines changed

7 files changed

+212
-150
lines changed

Mathlib/Algebra/Module/LinearMap/Defs.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -735,8 +735,8 @@ variable [Semiring R] [Semiring R₂]
735735
variable [AddCommMonoid M] [AddCommMonoid M₂]
736736
variable [Module R M] [Module R₂ M₂]
737737
variable {σ₁₂ : R →+* R₂}
738-
variable [Monoid S] [DistribMulAction S M₂] [SMulCommClass R₂ S M₂]
739-
variable [Monoid T] [DistribMulAction T M₂] [SMulCommClass R₂ T M₂]
738+
variable [DistribSMul S M₂] [SMulCommClass R₂ S M₂]
739+
variable [DistribSMul T M₂] [SMulCommClass R₂ T M₂]
740740

741741
instance : SMul S (M →ₛₗ[σ₁₂] M₂) :=
742742
fun a f ↦
@@ -759,7 +759,7 @@ instance [SMulCommClass S T M₂] : SMulCommClass S T (M →ₛₗ[σ₁₂] M
759759
instance [SMul S T] [IsScalarTower S T M₂] : IsScalarTower S T (M →ₛₗ[σ₁₂] M₂) where
760760
smul_assoc _ _ _ := ext fun _ ↦ smul_assoc _ _ _
761761

762-
instance [DistribMulAction Sᵐᵒᵖ M₂] [SMulCommClass R₂ Sᵐᵒᵖ M₂] [IsCentralScalar S M₂] :
762+
instance [DistribSMul Sᵐᵒᵖ M₂] [SMulCommClass R₂ Sᵐᵒᵖ M₂] [IsCentralScalar S M₂] :
763763
IsCentralScalar S (M →ₛₗ[σ₁₂] M₂) where
764764
op_smul_eq_smul _ _ := ext fun _ ↦ op_smul_eq_smul _ _
765765

Mathlib/Analysis/Normed/Module/Multilinear/Basic.lean

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -433,12 +433,11 @@ theorem opNorm_zero : ‖(0 : ContinuousMultilinearMap 𝕜 E G)‖ = 0 :=
433433

434434
section
435435

436-
variable {𝕜' : Type*} [NormedField 𝕜'] [NormedSpace 𝕜' G] [SMulCommClass 𝕜 𝕜' G]
436+
variable {𝕜' : Type*} [SeminormedRing 𝕜'] [Module 𝕜' G] [IsBoundedSMul 𝕜' G] [SMulCommClass 𝕜 𝕜' G]
437437

438438
theorem opNorm_smul_le (c : 𝕜') (f : ContinuousMultilinearMap 𝕜 E G) : ‖c • f‖ ≤ ‖c‖ * ‖f‖ :=
439439
(c • f).opNorm_le_bound (mul_nonneg (norm_nonneg _) (opNorm_nonneg _)) fun m ↦ by
440-
rw [smul_apply, norm_smul, mul_assoc]
441-
exact mul_le_mul_of_nonneg_left (le_opNorm _ _) (norm_nonneg _)
440+
grw [smul_apply, norm_smul_le, mul_assoc, le_opNorm]
442441

443442
variable (𝕜 E G) in
444443
/-- Operator seminorm on the space of continuous multilinear maps, as `Seminorm`.
@@ -499,6 +498,11 @@ instance seminormedAddCommGroup' :
499498
SeminormedAddCommGroup (ContinuousMultilinearMap 𝕜 (fun _ : ι => G) G') :=
500499
ContinuousMultilinearMap.seminormedAddCommGroup
501500

501+
instance : IsBoundedSMul 𝕜' (ContinuousMultilinearMap 𝕜 E G) := .of_norm_smul_le opNorm_smul_le
502+
503+
section NormedField
504+
variable {𝕜' : Type*} [NormedField 𝕜'] [NormedSpace 𝕜' G] [SMulCommClass 𝕜 𝕜' G]
505+
502506
instance normedSpace : NormedSpace 𝕜' (ContinuousMultilinearMap 𝕜 E G) :=
503507
fun c f => f.opNorm_smul_le c⟩
504508

@@ -507,6 +511,8 @@ search. -/
507511
instance normedSpace' : NormedSpace 𝕜' (ContinuousMultilinearMap 𝕜 (fun _ : ι => G') G) :=
508512
ContinuousMultilinearMap.normedSpace
509513

514+
end NormedField
515+
510516
/-- The fundamental property of the operator norm of a continuous multilinear map:
511517
`‖f m‖` is bounded by `‖f‖` times the product of the `‖m i‖`, `nnnorm` version. -/
512518
theorem le_opNNNorm (f : ContinuousMultilinearMap 𝕜 E G) (m : ∀ i, E i) :

Mathlib/Analysis/Normed/Operator/Basic.lean

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -328,12 +328,11 @@ theorem norm_id_of_nontrivial_seminorm (h : ∃ x : E, ‖x‖ ≠ 0) : ‖Conti
328328
have := (ContinuousLinearMap.id 𝕜 E).ratio_le_opNorm x
329329
rwa [id_apply, div_self hx] at this
330330

331-
theorem opNorm_smul_le {𝕜' : Type*} [NormedField 𝕜'] [NormedSpace 𝕜' F] [SMulCommClass 𝕜₂ 𝕜' F]
331+
theorem opNorm_smul_le {𝕜' : Type*} [DistribSMul 𝕜' F] [SMulCommClass 𝕜₂ 𝕜' F]
332+
[SeminormedAddCommGroup 𝕜'] [IsBoundedSMul 𝕜' F]
332333
(c : 𝕜') (f : E →SL[σ₁₂] F) : ‖c • f‖ ≤ ‖c‖ * ‖f‖ :=
333334
(c • f).opNorm_le_bound (mul_nonneg (norm_nonneg _) (opNorm_nonneg _)) fun _ => by
334-
rw [smul_apply, norm_smul, mul_assoc]
335-
gcongr
336-
apply le_opNorm
335+
grw [smul_apply, norm_smul_le, mul_assoc, le_opNorm]
337336

338337
theorem opNorm_le_iff_lipschitz {f : E →SL[σ₁₂] F} {K : ℝ≥0} :
339338
‖f‖ ≤ K ↔ LipschitzWith K f :=

0 commit comments

Comments
 (0)