Skip to content

Commit 38dc174

Browse files
committed
feat(StrongTopology): generalize ContinuousLinearMap.restrictScalarsL (#15285)
1 parent 3697f51 commit 38dc174

File tree

5 files changed

+124
-21
lines changed

5 files changed

+124
-21
lines changed

Mathlib/Algebra/Group/Action/Pi.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ namespace Pi
2828
@[to_additive]
2929
instance smul' [∀ i, SMul (α i) (β i)] : SMul (∀ i, α i) (∀ i, β i) where smul s x i := s i • x i
3030

31+
@[to_additive]
32+
lemma smul_def' [∀ i, SMul (α i) (β i)] (s : ∀ i, α i) (x : ∀ i, β i) : s • x = fun i ↦ s i • x i :=
33+
rfl
34+
3135
@[to_additive (attr := simp)]
3236
lemma smul_apply' [∀ i, SMul (α i) (β i)] (s : ∀ i, α i) (x : ∀ i, β i) : (s • x) i = s i • x i :=
3337
rfl

Mathlib/Analysis/LocallyConvex/Bounded.lean

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,16 @@ theorem isVonNBounded_union {s t : Set E} :
9393
theorem IsVonNBounded.union {s₁ s₂ : Set E} (hs₁ : IsVonNBounded 𝕜 s₁) (hs₂ : IsVonNBounded 𝕜 s₂) :
9494
IsVonNBounded 𝕜 (s₁ ∪ s₂) := isVonNBounded_union.2 ⟨hs₁, hs₂⟩
9595

96+
@[nontriviality]
9697
theorem IsVonNBounded.of_boundedSpace [BoundedSpace 𝕜] {s : Set E} : IsVonNBounded 𝕜 s := fun _ _ ↦
9798
.of_boundedSpace
9899

100+
@[nontriviality]
101+
theorem IsVonNBounded.of_subsingleton [Subsingleton E] {s : Set E} : IsVonNBounded 𝕜 s :=
102+
fun U hU ↦ eventually_of_forall fun c ↦ calc
103+
s ⊆ univ := subset_univ s
104+
_ = c • U := .symm <| Subsingleton.eq_univ_of_nonempty <| (Filter.nonempty_of_mem hU).image _
105+
99106
@[simp]
100107
theorem isVonNBounded_iUnion {ι : Sort*} [Finite ι] {s : ι → Set E} :
101108
IsVonNBounded 𝕜 (⋃ i, s i) ↔ ∀ i, IsVonNBounded 𝕜 (s i) := by
@@ -237,6 +244,20 @@ theorem isVonNBounded_iff_smul_tendsto_zero {ε : ι → 𝕜} {l : Filter ι} [
237244

238245
end sequence
239246

247+
/-- If a set is von Neumann bounded with respect to a smaller field,
248+
then it is also von Neumann bounded with respect to a larger field.
249+
See also `Bornology.IsVonNBounded.restrict_scalars` below. -/
250+
theorem IsVonNBounded.extend_scalars [NontriviallyNormedField 𝕜]
251+
{E : Type*} [AddCommGroup E] [Module 𝕜 E]
252+
(𝕝 : Type*) [NontriviallyNormedField 𝕝] [NormedAlgebra 𝕜 𝕝]
253+
[Module 𝕝 E] [TopologicalSpace E] [ContinuousSMul 𝕝 E] [IsScalarTower 𝕜 𝕝 E]
254+
{s : Set E} (h : IsVonNBounded 𝕜 s) : IsVonNBounded 𝕝 s := by
255+
obtain ⟨ε, hε, hε₀⟩ : ∃ ε : ℕ → 𝕜, Tendsto ε atTop (𝓝 0) ∧ ∀ᶠ n in atTop, ε n ≠ 0 := by
256+
simpa only [tendsto_nhdsWithin_iff] using exists_seq_tendsto (𝓝[≠] (0 : 𝕜))
257+
refine isVonNBounded_of_smul_tendsto_zero (ε := (ε · • 1)) (by simpa) fun x hx ↦ ?_
258+
have := h.smul_tendsto_zero (eventually_of_forall hx) hε
259+
simpa only [Pi.smul_def', smul_one_smul]
260+
240261
section NormedField
241262

242263
variable [NormedField 𝕜] [AddCommGroup E] [Module 𝕜 E]
@@ -379,6 +400,31 @@ theorem Filter.Tendsto.isVonNBounded_range [NormedField 𝕜] [AddCommGroup E] [
379400
haveI := comm_topologicalAddGroup_is_uniform (G := E)
380401
hf.cauchySeq.totallyBounded_range.isVonNBounded 𝕜
381402

403+
variable (𝕜) in
404+
protected theorem Bornology.IsVonNBounded.restrict_scalars_of_nontrivial
405+
[NormedField 𝕜] [NormedRing 𝕜'] [NormedAlgebra 𝕜 𝕜'] [Nontrivial 𝕜']
406+
[Zero E] [TopologicalSpace E]
407+
[SMul 𝕜 E] [MulAction 𝕜' E] [IsScalarTower 𝕜 𝕜' E] {s : Set E}
408+
(h : IsVonNBounded 𝕜' s) : IsVonNBounded 𝕜 s := by
409+
intro V hV
410+
refine (h hV).restrict_scalars <| AntilipschitzWith.tendsto_cobounded (K := ‖(1 : 𝕜')‖₊⁻¹) ?_
411+
refine AntilipschitzWith.of_le_mul_nndist fun x y ↦ ?_
412+
rw [nndist_eq_nnnorm, nndist_eq_nnnorm, ← sub_smul, nnnorm_smul, ← div_eq_inv_mul,
413+
mul_div_cancel_right₀ _ (nnnorm_ne_zero_iff.2 one_ne_zero)]
414+
415+
variable (𝕜) in
416+
protected theorem Bornology.IsVonNBounded.restrict_scalars
417+
[NormedField 𝕜] [NormedRing 𝕜'] [NormedAlgebra 𝕜 𝕜']
418+
[Zero E] [TopologicalSpace E]
419+
[SMul 𝕜 E] [MulActionWithZero 𝕜' E] [IsScalarTower 𝕜 𝕜' E] {s : Set E}
420+
(h : IsVonNBounded 𝕜' s) : IsVonNBounded 𝕜 s :=
421+
match subsingleton_or_nontrivial 𝕜' with
422+
| .inl _ =>
423+
have : Subsingleton E := MulActionWithZero.subsingleton 𝕜' E
424+
IsVonNBounded.of_subsingleton
425+
| .inr _ =>
426+
h.restrict_scalars_of_nontrivial _
427+
382428
section VonNBornologyEqMetric
383429

384430
namespace NormedSpace

Mathlib/Analysis/NormedSpace/OperatorNorm/Basic.lean

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -413,24 +413,6 @@ theorem restrictScalarsIsometry_toLinearMap :
413413
(restrictScalarsIsometry 𝕜 E Fₗ 𝕜' 𝕜'').toLinearMap = restrictScalarsₗ 𝕜 E Fₗ 𝕜' 𝕜'' :=
414414
rfl
415415

416-
variable (𝕜'')
417-
418-
419-
/-- `ContinuousLinearMap.restrictScalars` as a `ContinuousLinearMap`. -/
420-
def restrictScalarsL : (E →L[𝕜] Fₗ) →L[𝕜''] E →L[𝕜'] Fₗ :=
421-
(restrictScalarsIsometry 𝕜 E Fₗ 𝕜' 𝕜'').toContinuousLinearMap
422-
423-
variable {𝕜 E Fₗ 𝕜' 𝕜''}
424-
425-
@[simp]
426-
theorem coe_restrictScalarsL : (restrictScalarsL 𝕜 E Fₗ 𝕜' 𝕜'' : (E →L[𝕜] Fₗ) →ₗ[𝕜''] E →L[𝕜'] Fₗ) =
427-
restrictScalarsₗ 𝕜 E Fₗ 𝕜' 𝕜'' :=
428-
rfl
429-
430-
@[simp]
431-
theorem coe_restrict_scalarsL' : ⇑(restrictScalarsL 𝕜 E Fₗ 𝕜' 𝕜'') = restrictScalars 𝕜' :=
432-
rfl
433-
434416
end RestrictScalars
435417

436418
lemma norm_pi_le_of_le {ι : Type*} [Fintype ι]

Mathlib/Topology/Algebra/Module/StrongTopology.lean

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,10 @@ protected theorem hasBasis_nhds_zero [TopologicalSpace F] [TopologicalAddGroup F
275275
fun SV => { f : E →SL[σ] F | ∀ x ∈ SV.1, f x ∈ SV.2 } :=
276276
ContinuousLinearMap.hasBasis_nhds_zero_of_basis (𝓝 0).basis_sets
277277

278+
theorem uniformEmbedding_toUniformOnFun [UniformSpace F] [UniformAddGroup F] :
279+
UniformEmbedding fun f : E →SL[σ] F ↦ UniformOnFun.ofFun {s | Bornology.IsVonNBounded 𝕜₁ s} f :=
280+
UniformConvergenceCLM.uniformEmbedding_coeFn ..
281+
278282
instance uniformContinuousConstSMul
279283
{M : Type*} [Monoid M] [DistribMulAction M F] [SMulCommClass 𝕜₂ M F]
280284
[UniformSpace F] [UniformAddGroup F] [UniformContinuousConstSMul M F] :
@@ -345,6 +349,66 @@ def toLinearMap₂ (L : E →L[𝕜] F →L[𝕜] G) : E →ₗ[𝕜] F →ₗ[
345349

346350
end BilinearMaps
347351

352+
section RestrictScalars
353+
354+
variable {𝕜 : Type*} [NontriviallyNormedField 𝕜]
355+
{E : Type*} [AddCommGroup E] [TopologicalSpace E] [Module 𝕜 E] [ContinuousSMul 𝕜 E]
356+
{F : Type*} [AddCommGroup F]
357+
358+
section UniformSpace
359+
360+
variable [UniformSpace F] [UniformAddGroup F] [Module 𝕜 F]
361+
(𝕜' : Type*) [NontriviallyNormedField 𝕜'] [NormedAlgebra 𝕜' 𝕜]
362+
[Module 𝕜' E] [IsScalarTower 𝕜' 𝕜 E] [Module 𝕜' F] [IsScalarTower 𝕜' 𝕜 F]
363+
364+
theorem uniformEmbedding_restrictScalars :
365+
UniformEmbedding (restrictScalars 𝕜' : (E →L[𝕜] F) → (E →L[𝕜'] F)) := by
366+
rw [← uniformEmbedding_toUniformOnFun.of_comp_iff]
367+
convert uniformEmbedding_toUniformOnFun using 4 with s
368+
exact ⟨fun h ↦ h.extend_scalars _, fun h ↦ h.restrict_scalars _⟩
369+
370+
theorem uniformContinuous_restrictScalars :
371+
UniformContinuous (restrictScalars 𝕜' : (E →L[𝕜] F) → (E →L[𝕜'] F)) :=
372+
(uniformEmbedding_restrictScalars 𝕜').uniformContinuous
373+
374+
end UniformSpace
375+
376+
variable [TopologicalSpace F] [TopologicalAddGroup F] [Module 𝕜 F]
377+
(𝕜' : Type*) [NontriviallyNormedField 𝕜'] [NormedAlgebra 𝕜' 𝕜]
378+
[Module 𝕜' E] [IsScalarTower 𝕜' 𝕜 E] [Module 𝕜' F] [IsScalarTower 𝕜' 𝕜 F]
379+
380+
theorem embedding_restrictScalars :
381+
Embedding (restrictScalars 𝕜' : (E →L[𝕜] F) → (E →L[𝕜'] F)) :=
382+
letI : UniformSpace F := TopologicalAddGroup.toUniformSpace F
383+
haveI : UniformAddGroup F := comm_topologicalAddGroup_is_uniform
384+
(uniformEmbedding_restrictScalars _).embedding
385+
386+
@[continuity, fun_prop]
387+
theorem continuous_restrictScalars :
388+
Continuous (restrictScalars 𝕜' : (E →L[𝕜] F) → (E →L[𝕜'] F)) :=
389+
(embedding_restrictScalars _).continuous
390+
391+
variable (𝕜 E F)
392+
variable (𝕜'' : Type*) [Ring 𝕜'']
393+
[Module 𝕜'' F] [ContinuousConstSMul 𝕜'' F] [SMulCommClass 𝕜 𝕜'' F] [SMulCommClass 𝕜' 𝕜'' F]
394+
395+
/-- `ContinuousLinearMap.restrictScalars` as a `ContinuousLinearMap`. -/
396+
def restrictScalarsL : (E →L[𝕜] F) →L[𝕜''] E →L[𝕜'] F :=
397+
.mk <| restrictScalarsₗ 𝕜 E F 𝕜' 𝕜''
398+
399+
variable {𝕜 E F 𝕜' 𝕜''}
400+
401+
@[simp]
402+
theorem coe_restrictScalarsL : (restrictScalarsL 𝕜 E F 𝕜' 𝕜'' : (E →L[𝕜] F) →ₗ[𝕜''] E →L[𝕜'] F) =
403+
restrictScalarsₗ 𝕜 E F 𝕜' 𝕜'' :=
404+
rfl
405+
406+
@[simp]
407+
theorem coe_restrict_scalarsL' : ⇑(restrictScalarsL 𝕜 E F 𝕜' 𝕜'') = restrictScalars 𝕜' :=
408+
rfl
409+
410+
end RestrictScalars
411+
348412
end ContinuousLinearMap
349413

350414
open ContinuousLinearMap
@@ -357,8 +421,8 @@ section Semilinear
357421

358422
variable {𝕜 : Type*} {𝕜₂ : Type*} {𝕜₃ : Type*} {𝕜₄ : Type*} {E : Type*} {F : Type*}
359423
{G : Type*} {H : Type*} [AddCommGroup E] [AddCommGroup F] [AddCommGroup G] [AddCommGroup H]
360-
[NontriviallyNormedField 𝕜] [NontriviallyNormedField 𝕜₂] [NontriviallyNormedField 𝕜₃]
361-
[NontriviallyNormedField 𝕜₄] [Module 𝕜 E] [Module 𝕜₂ F] [Module 𝕜₃ G] [Module 𝕜₄ H]
424+
[NormedField 𝕜] [NormedField 𝕜₂] [NormedField 𝕜₃] [NormedField 𝕜₄]
425+
[Module 𝕜 E] [Module 𝕜₂ F] [Module 𝕜₃ G] [Module 𝕜₄ H]
362426
[TopologicalSpace E] [TopologicalSpace F] [TopologicalSpace G] [TopologicalSpace H]
363427
[TopologicalAddGroup G] [TopologicalAddGroup H] [ContinuousConstSMul 𝕜₃ G]
364428
[ContinuousConstSMul 𝕜₄ H] {σ₁₂ : 𝕜 →+* 𝕜₂} {σ₂₁ : 𝕜₂ →+* 𝕜} {σ₂₃ : 𝕜₂ →+* 𝕜₃} {σ₁₃ : 𝕜 →+* 𝕜₃}
@@ -404,7 +468,7 @@ end Semilinear
404468
section Linear
405469

406470
variable {𝕜 : Type*} {E : Type*} {F : Type*} {G : Type*} {H : Type*} [AddCommGroup E]
407-
[AddCommGroup F] [AddCommGroup G] [AddCommGroup H] [NontriviallyNormedField 𝕜] [Module 𝕜 E]
471+
[AddCommGroup F] [AddCommGroup G] [AddCommGroup H] [NormedField 𝕜] [Module 𝕜 E]
408472
[Module 𝕜 F] [Module 𝕜 G] [Module 𝕜 H] [TopologicalSpace E] [TopologicalSpace F]
409473
[TopologicalSpace G] [TopologicalSpace H] [TopologicalAddGroup G] [TopologicalAddGroup H]
410474
[ContinuousConstSMul 𝕜 G] [ContinuousConstSMul 𝕜 H]

Mathlib/Topology/Bornology/Absorbs.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,3 +244,10 @@ lemma Absorbent.zero_mem [NeBot (cobounded G₀)] [AddMonoid E] [DistribMulActio
244244
absorbs_zero_iff.1 (hs 0)
245245

246246
end GroupWithZero
247+
248+
protected theorem Absorbs.restrict_scalars
249+
{M N α : Type*} [Monoid N] [SMul M N] [SMul M α] [MulAction N α]
250+
[IsScalarTower M N α] [Bornology M] [Bornology N] {s t : Set α} (h : Absorbs N s t)
251+
(hbdd : Tendsto (· • 1 : M → N) (cobounded M) (cobounded N)) :
252+
Absorbs M s t :=
253+
(hbdd.eventually h).mono <| fun x hx ↦ by rwa [smul_one_smul N x s] at hx

0 commit comments

Comments
 (0)