@@ -5,7 +5,9 @@ Authors: Yury Kudryashov
55-/
66module
77
8+ public import Mathlib.Topology.Algebra.Module.Equiv
89public import Mathlib.Topology.Algebra.Module.Multilinear.Bounded
10+ public import Mathlib.Topology.Algebra.Module.StrongTopology
911public import Mathlib.Topology.Algebra.Module.UniformConvergence
1012public import Mathlib.Topology.Algebra.SeparationQuotient.Section
1113public import Mathlib.Topology.Hom.ContinuousEvalConst
@@ -212,6 +214,53 @@ theorem hasBasis_nhds_zero :
212214 { f | MapsTo f SV.1 SV.2 } :=
213215 hasBasis_nhds_zero_of_basis (Filter.basis_sets _)
214216
217+ theorem eventually_nhds_zero_mapsTo {s : Set (∀ i, E i)} (hs : IsVonNBounded 𝕜 s)
218+ {U : Set F} (hu : U ∈ 𝓝 0 ) :
219+ ∀ᶠ f : ContinuousMultilinearMap 𝕜 E F in 𝓝 0 , MapsTo f s U :=
220+ hasBasis_nhds_zero.mem_of_mem (i := (s, U)) ⟨hs, hu⟩
221+
222+ theorem isVonNBounded_image2_apply [ContinuousConstSMul 𝕜 F]
223+ {S : Set (ContinuousMultilinearMap 𝕜 E F)} (hS : IsVonNBounded 𝕜 S)
224+ {s : Set (∀ i, E i)} (hs : IsVonNBounded 𝕜 s) :
225+ IsVonNBounded 𝕜 (Set.image2 (fun f x ↦ f x) S s) := by
226+ intro U hU
227+ filter_upwards [hS (eventually_nhds_zero_mapsTo hs hU)] with c hc
228+ rw [image2_subset_iff]
229+ intro f hf x hx
230+ rcases hc hf with ⟨g, hg, rfl⟩
231+ exact smul_mem_smul_set (hg hx)
232+
233+ section CompContinuousLinearMap
234+ variable {E₁ : ι → Type *} [∀ i, TopologicalSpace (E₁ i)] [ContinuousConstSMul 𝕜 F]
235+ [∀ i, AddCommGroup (E₁ i)] [∀ i, Module 𝕜 (E₁ i)]
236+
237+ /-- `ContinuousMultilinearMap.compContinuousLinearMap` as a bundled continuous linear map.
238+ Given a family of continuous linear maps `f : Π i, E i →L[𝕜] E₁ i`,
239+ this function returns a continuous linear maps between the spaces of continuous multilinear maps
240+ on `Π i, E₁ i` and on `Π i, E i`.
241+ The map sends `g` to the map given by `v ↦ g (fun i ↦ f i (v i))`.
242+
243+ Actually, the map is multilinear in `f`,
244+ see `ContinuousMultilinearMap.compContinuousLinearMapContinuousMultilinear`.
245+
246+ For a version fixing `g` and varying `f`, see `compContinuousLinearMapLRight`. -/
247+ @ [simps! apply]
248+ def compContinuousLinearMapL (f : ∀ i, E i →L[𝕜] E₁ i) :
249+ ContinuousMultilinearMap 𝕜 E₁ F →L[𝕜] ContinuousMultilinearMap 𝕜 E F :=
250+ letI aux : ContinuousMultilinearMap 𝕜 E₁ F →ₗ[𝕜] ContinuousMultilinearMap 𝕜 E F :=
251+ { toFun g := g.compContinuousLinearMap f
252+ map_add' _ _ := by ext; simp
253+ map_smul' _ _ := by ext; simp }
254+ { toLinearMap := aux
255+ cont := by
256+ apply continuous_of_tendsto_nhds_zero aux
257+ rw [hasBasis_nhds_zero.tendsto_iff hasBasis_nhds_zero]
258+ rintro ⟨U, V⟩ ⟨hU, hV⟩
259+ set φ : (∀ i, E i) →L[𝕜] (∀ i, E₁ i) := .piMap f
260+ exact ⟨(φ '' U, V), ⟨hU.image φ, hV⟩, fun g hg ↦ hg.comp (mapsTo_image _ _)⟩ }
261+
262+ end CompContinuousLinearMap
263+
215264variable [∀ i, ContinuousSMul 𝕜 (E i)]
216265
217266instance : ContinuousEvalConst (ContinuousMultilinearMap 𝕜 E F) (Π i, E i) F where
@@ -280,3 +329,127 @@ theorem tsum_eval [T2Space F] {α : Type*} {p : α → ContinuousMultilinearMap
280329 (hasSum_eval hp.hasSum m).tsum_eq.symm
281330
282331end ContinuousMultilinearMap
332+
333+ namespace ContinuousLinearMap
334+
335+ variable {𝕜 ι : Type *} {E : ι → Type *} {F G : Type *} [NormedField 𝕜] [∀ i, TopologicalSpace (E i)]
336+ [∀ i, AddCommGroup (E i)] [∀ i, Module 𝕜 (E i)]
337+ [AddCommGroup F] [Module 𝕜 F] [TopologicalSpace F] [IsTopologicalAddGroup F]
338+ [ContinuousConstSMul 𝕜 F]
339+ [AddCommGroup G] [Module 𝕜 G] [TopologicalSpace G] [IsTopologicalAddGroup G]
340+ [ContinuousConstSMul 𝕜 G]
341+
342+ variable (𝕜 E F G) in
343+ /-- `ContinuousLinearMap.compContinuousMultilinearMap` as a bundled continuous bilinear map.
344+
345+ Given a continuous linear map `f : F →L[𝕜] G`
346+ and a continuous multilinear map `g` from `Π i, E i` to `F`,
347+ this function returns `f ∘ g` as a continuous multilinear map.
348+
349+ With this order of arguments, the function is continuous in `g` (for each fixed `f`)
350+ and is continuous in `f` (as a function to the space of continuous linear maps).
351+ Note that for general topological vector spaces, it is not guaranteed to be continuous in `(g, f)`.
352+ -/
353+ def compContinuousMultilinearMapL :
354+ (F →L[𝕜] G) →L[𝕜] ContinuousMultilinearMap 𝕜 E F →L[𝕜] ContinuousMultilinearMap 𝕜 E G :=
355+ letI aux : (F →L[𝕜] G) →ₗ[𝕜]
356+ ContinuousMultilinearMap 𝕜 E F →L[𝕜] ContinuousMultilinearMap 𝕜 E G :=
357+ { toFun g :=
358+ letI aux₁ : ContinuousMultilinearMap 𝕜 E F →ₗ[𝕜] ContinuousMultilinearMap 𝕜 E G :=
359+ { toFun := g.compContinuousMultilinearMap
360+ map_add' _ _ := by ext; simp
361+ map_smul' _ _ := by ext; simp }
362+ { toLinearMap := aux₁
363+ cont := by
364+ apply continuous_of_tendsto_nhds_zero aux₁
365+ rw [ContinuousMultilinearMap.hasBasis_nhds_zero.tendsto_iff
366+ ContinuousMultilinearMap.hasBasis_nhds_zero]
367+ rintro ⟨U, V⟩ ⟨hU, hV⟩
368+ refine ⟨(U, g ⁻¹' V), ⟨hU, ?_⟩, ?_⟩
369+ · exact (map_continuous g).tendsto 0 <| by simpa
370+ · exact fun f hf ↦ hf
371+ }
372+ map_add' _ _ := by ext; simp
373+ map_smul' _ _ := by ext; simp }
374+ { toLinearMap := aux
375+ cont := by
376+ apply continuous_of_tendsto_nhds_zero aux
377+ rw [ContinuousLinearMap.hasBasis_nhds_zero.tendsto_iff <|
378+ ContinuousLinearMap.hasBasis_nhds_zero_of_basis <|
379+ ContinuousMultilinearMap.hasBasis_nhds_zero]
380+ rintro ⟨U, V, W⟩ ⟨hU, hV, hW⟩
381+ refine ⟨(.image2 (fun f v ↦ f v) U V, W), ⟨?_, hW⟩, ?_⟩
382+ · exact ContinuousMultilinearMap.isVonNBounded_image2_apply hU hV
383+ · exact fun g hg f hf m hm ↦ hg _ <| mem_image2_of_mem hf hm }
384+
385+ @[simp]
386+ theorem compContinuousMultilinearMapL_apply (g : F →L[𝕜] G) (f : ContinuousMultilinearMap 𝕜 E F) :
387+ compContinuousMultilinearMapL 𝕜 E F G g f = g.compContinuousMultilinearMap f :=
388+ rfl
389+
390+ end ContinuousLinearMap
391+
392+ namespace ContinuousLinearEquiv
393+
394+ variable {𝕜 ι : Type *} {E E₁ : ι → Type *} {F G : Type *} [NormedField 𝕜]
395+ [∀ i, TopologicalSpace (E i)] [∀ i, AddCommGroup (E i)] [∀ i, Module 𝕜 (E i)]
396+ [∀ i, TopologicalSpace (E₁ i)] [∀ i, AddCommGroup (E₁ i)] [∀ i, Module 𝕜 (E₁ i)]
397+ [AddCommGroup F] [Module 𝕜 F] [TopologicalSpace F] [IsTopologicalAddGroup F]
398+ [ContinuousConstSMul 𝕜 F]
399+ [AddCommGroup G] [Module 𝕜 G] [TopologicalSpace G] [IsTopologicalAddGroup G]
400+ [ContinuousConstSMul 𝕜 G]
401+
402+ variable (F) in
403+ /-- `ContinuousMultilinearMap.compContinuousLinearMap` as a bundled continuous linear equiv.
404+ Given a family of continuous linear equivalences `f : Π i, E i ≃L[𝕜] E₁ i`,
405+ this function returns a continuous linear equivalence
406+ between the space of continuous multilinear maps with domain `Π i, E i` and codomain `F`
407+ and the space of multilinear maps with domain `Π i, E₁ i` and the same codomain,
408+ by composing the multilinear maps with `f`. -/
409+ def continuousMultilinearMapCongrLeft (f : ∀ i, E i ≃L[𝕜] E₁ i) :
410+ ContinuousMultilinearMap 𝕜 E₁ F ≃L[𝕜] ContinuousMultilinearMap 𝕜 E F where
411+ __ := ContinuousMultilinearMap.compContinuousLinearMapL fun i ↦ ↑(f i)
412+ invFun := ContinuousMultilinearMap.compContinuousLinearMapL fun i ↦ ↑(f i).symm
413+ left_inv g := by ext; simp
414+ right_inv g := by ext; simp
415+
416+ @[simp]
417+ theorem continuousMultilinearMapCongrLeft_symm
418+ (f : ∀ i, E i ≃L[𝕜] E₁ i) :
419+ (ContinuousLinearEquiv.continuousMultilinearMapCongrLeft F f).symm =
420+ .continuousMultilinearMapCongrLeft F fun i : ι ↦ (f i).symm :=
421+ rfl
422+
423+ @[simp]
424+ theorem continuousMultilinearMapCongrLeft_apply
425+ (g : ContinuousMultilinearMap 𝕜 E₁ F) (f : ∀ i, E i ≃L[𝕜] E₁ i) :
426+ ContinuousLinearEquiv.continuousMultilinearMapCongrLeft F f g =
427+ g.compContinuousLinearMap fun i ↦ (f i : E i →L[𝕜] E₁ i) :=
428+ rfl
429+
430+ variable (E) in
431+ /-- `ContinuousLinearMap.compContinuousMultilinearMap` as a bundled continuous linear equiv.
432+ Given a continuous linear equivalence `g : F ≃L[𝕜] G`,
433+ this function builds a continuous linear equivalence
434+ between the space of continuous multilinear maps with codomain `F`
435+ and the space of continuous multilinear maps with codomain `G`,
436+ by composing these maps with `g` or `g.symm`. -/
437+ def continuousMultilinearMapCongrRight (g : F ≃L[𝕜] G) :
438+ ContinuousMultilinearMap 𝕜 E F ≃L[𝕜] ContinuousMultilinearMap 𝕜 E G where
439+ __ := ContinuousLinearMap.compContinuousMultilinearMapL _ _ _ _ g
440+ invFun := ContinuousLinearMap.compContinuousMultilinearMapL _ _ _ _ g.symm
441+ left_inv _ := by ext; simp
442+ right_inv _ := by ext; simp
443+
444+ @[simp]
445+ theorem continuousMultilinearMapCongrRight_symm (g : F ≃L[𝕜] G) :
446+ (g.continuousMultilinearMapCongrRight E).symm = g.symm.continuousMultilinearMapCongrRight E :=
447+ rfl
448+
449+ @[simp]
450+ theorem continuousMultilinearMapCongrRight_apply (g : F ≃L[𝕜] G)
451+ (f : ContinuousMultilinearMap 𝕜 E F) :
452+ g.continuousMultilinearMapCongrRight E f = (g : F →L[𝕜] G).compContinuousMultilinearMap f :=
453+ rfl
454+
455+ end ContinuousLinearEquiv
0 commit comments