Skip to content

Commit f2da3f8

Browse files
matthewjasperocfnash
authored andcommitted
feat(Topology/Algebra/Module): Add more theorems for IsModuleTopology (leanprover-community#24527)
Add theorems that surjective linear maps to the module topology are open. Add IsModuleTopology instance for quotients. Add IsModuleTopology instance for finite dimensional T2 vector spaces over a complete normed field and use it to shorten some proofs. Co-authored-by: Oliver Nash <github@olivernash.org> Co-authored-by: Oliver Nash <7734364+ocfnash@users.noreply.github.com>
1 parent 2443f91 commit f2da3f8

File tree

4 files changed

+56
-26
lines changed

4 files changed

+56
-26
lines changed

Mathlib/Analysis/Fourier/AddCircleMulti.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,11 @@ theorem coeFn_mFourierLp (p : ℝ≥0∞) [Fact (1 ≤ p)] (n : d → ℤ) :
152152
mFourierLp p n =ᵐ[volume] mFourier n :=
153153
ContinuousMap.coeFn_toLp volume (mFourier n)
154154

155+
-- shortcut instance: avoids `synthInstance.maxHeartbeats` issue in `span_mFourierLp_closure_eq_top`
156+
instance {p : ℝ≥0∞} [Fact (1 ≤ p)] :
157+
ContinuousSMul ℂ (Lp ℂ p (volume : Measure (UnitAddTorus d))) :=
158+
inferInstance
159+
155160
/-- For each `1 ≤ p < ∞`, the linear span of the monomials `mFourier n` is dense in the `Lᵖ` space
156161
of functions on `UnitAddTorus d`. -/
157162
theorem span_mFourierLp_closure_eq_top {p : ℝ≥0∞} [Fact (1 ≤ p)] (hp : p ≠ ∞) :

Mathlib/Analysis/RCLike/Lemmas.lean

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,9 @@ variable [NormedAddCommGroup E] [NormedSpace K E]
6060
This is not an instance because it would cause a search for `FiniteDimensional ?x E` before
6161
`RCLike ?x`. -/
6262
theorem proper_rclike [FiniteDimensional K E] : ProperSpace E := by
63-
letI : NormedSpace ℝ E := RestrictScalars.normedSpace ℝ K E
64-
letI : FiniteDimensional ℝ E := FiniteDimensional.trans ℝ K E
63+
-- Using `have` not `let` since it is only existence of `NormedSpace` structure that we need.
64+
have : NormedSpace ℝ E := RestrictScalars.normedSpace ℝ K E
65+
have : FiniteDimensional ℝ E := FiniteDimensional.trans ℝ K E
6566
infer_instance
6667

6768
variable {E}

Mathlib/Topology/Algebra/Module/FiniteDimension.lean

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import Mathlib.LinearAlgebra.FiniteDimensional.Lemmas
88
import Mathlib.LinearAlgebra.FreeModule.Finite.Matrix
99
import Mathlib.RingTheory.LocalRing.Basic
1010
import Mathlib.Topology.Algebra.Module.Determinant
11+
import Mathlib.Topology.Algebra.Module.ModuleTopology
1112
import Mathlib.Topology.Algebra.Module.Simple
1213
import Mathlib.Topology.Algebra.SeparationQuotient.FiniteDimensional
1314

@@ -238,23 +239,26 @@ private theorem continuous_equivFun_basis_aux [T2Space E] {ι : Type v} [Fintype
238239
change Continuous (ξ.coord i)
239240
exact H₂ (ξ.coord i)
240241

241-
/-- Any linear map on a finite dimensional space over a complete field is continuous. -/
242-
theorem LinearMap.continuous_of_finiteDimensional [T2Space E] [FiniteDimensional 𝕜 E]
243-
(f : E →ₗ[𝕜] F') : Continuous f := by
242+
/-- A finite-dimensional t2 vector space over a complete field must carry the module topology.
243+
244+
Not declared as a global instance only for performance reasons. -/
245+
@[local instance]
246+
lemma isModuleTopologyOfFiniteDimensional [T2Space E] [FiniteDimensional 𝕜 E] :
247+
IsModuleTopology 𝕜 E :=
244248
-- for the proof, go to a model vector space `b → 𝕜` thanks to `continuous_equivFun_basis`, and
245-
-- argue that all linear maps there are continuous.
249+
-- use that it has the module topology
246250
let b := Basis.ofVectorSpace 𝕜 E
247-
have A : Continuous b.equivFun := continuous_equivFun_basis_aux b
248-
have B : Continuous (f.comp (b.equivFun.symm : (Basis.ofVectorSpaceIndex 𝕜 E → 𝕜) →ₗ[𝕜] E)) :=
249-
LinearMap.continuous_on_pi _
250-
have :
251-
Continuous
252-
(f.comp (b.equivFun.symm : (Basis.ofVectorSpaceIndex 𝕜 E → 𝕜) →ₗ[𝕜] E) ∘ b.equivFun) :=
253-
B.comp A
254-
convert this
255-
ext x
256-
dsimp
257-
rw [Basis.equivFun_symm_apply, Basis.sum_repr]
251+
have continuousEquiv : E ≃L[𝕜] (Basis.ofVectorSpaceIndex 𝕜 E) → 𝕜 :=
252+
{ __ := b.equivFun
253+
continuous_toFun := continuous_equivFun_basis_aux b
254+
continuous_invFun := IsModuleTopology.continuous_of_linearMap (R := 𝕜)
255+
(A := (Basis.ofVectorSpaceIndex 𝕜 E) → 𝕜) (B := E) b.equivFun.symm }
256+
IsModuleTopology.iso continuousEquiv.symm
257+
258+
/-- Any linear map on a finite dimensional space over a complete field is continuous. -/
259+
theorem LinearMap.continuous_of_finiteDimensional [T2Space E] [FiniteDimensional 𝕜 E]
260+
(f : E →ₗ[𝕜] F') : Continuous f :=
261+
IsModuleTopology.continuous_of_linearMap f
258262

259263
instance LinearMap.continuousLinearMapClassOfFiniteDimensional [T2Space E] [FiniteDimensional 𝕜 E] :
260264
ContinuousLinearMapClass (E →ₗ[𝕜] F') 𝕜 E F' :=
@@ -322,15 +326,8 @@ theorem range_toContinuousLinearMap (f : E →ₗ[𝕜] F') :
322326

323327
/-- A surjective linear map `f` with finite dimensional codomain is an open map. -/
324328
theorem isOpenMap_of_finiteDimensional (f : F →ₗ[𝕜] E) (hf : Function.Surjective f) :
325-
IsOpenMap f := by
326-
obtain ⟨g, hg⟩ := f.exists_rightInverse_of_surjective (LinearMap.range_eq_top.2 hf)
327-
refine IsOpenMap.of_sections fun x => ⟨fun y => g (y - f x) + x, ?_, ?_, fun y => ?_⟩
328-
· exact
329-
((g.continuous_of_finiteDimensional.comp <| continuous_id.sub continuous_const).add
330-
continuous_const).continuousAt
331-
· simp only
332-
rw [sub_self, map_zero, zero_add]
333-
· simp only [map_sub, map_add, ← comp_apply f g, hg, id_apply, sub_add_cancel]
329+
IsOpenMap f :=
330+
IsModuleTopology.isOpenMap_of_surjective hf
334331

335332
instance canLiftContinuousLinearMap : CanLift (E →ₗ[𝕜] F) (E →L[𝕜] F) (↑) fun _ => True :=
336333
fun f _ => ⟨LinearMap.toContinuousLinearMap f, rfl⟩⟩

Mathlib/Topology/Algebra/Module/ModuleTopology.lean

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Kevin Buzzard, Will Sawin
66
import Mathlib.Topology.Algebra.Module.Equiv
77
import Mathlib.RingTheory.Finiteness.Cardinality
88
import Mathlib.Algebra.Algebra.Bilinear
9+
import Mathlib.Algebra.Group.Basic
910

1011
/-!
1112
# A "module topology" for modules over a topological ring
@@ -414,13 +415,39 @@ theorem isQuotientMap_of_surjective [τB : TopologicalSpace B] [IsModuleTopology
414415
rw [← (IsOpenQuotientMap.prodMap hφo hφo).continuous_comp_iff, hφ2]
415416
exact Continuous.comp hφo.continuous hA
416417

418+
/-- A linear surjection between modules with the module topology is an open quotient map. -/
419+
theorem isOpenQuotientMap_of_surjective [TopologicalSpace B] [IsModuleTopology R B]
420+
{φ : A →ₗ[R] B} (hφ : Function.Surjective φ) :
421+
IsOpenQuotientMap φ :=
422+
have := toContinuousAdd R A
423+
AddMonoidHom.isOpenQuotientMap_of_isQuotientMap <| isQuotientMap_of_surjective hφ
424+
425+
omit [IsModuleTopology R A] in
426+
/-- A linear surjection to a module with the module topology is open. -/
427+
theorem isOpenMap_of_surjective [TopologicalSpace B] [IsModuleTopology R B]
428+
[ContinuousAdd A] [ContinuousSMul R A] {φ : A →ₗ[R] B} (hφ : Function.Surjective φ) :
429+
IsOpenMap φ := by
430+
have hOpenMap :=
431+
letI : TopologicalSpace A := moduleTopology R A
432+
have : IsModuleTopology R A := ⟨rfl⟩
433+
isOpenQuotientMap_of_surjective hφ |>.isOpenMap
434+
intro U hU
435+
exact hOpenMap U <| moduleTopology_le R A U hU
436+
417437
lemma _root_.ModuleTopology.eq_coinduced_of_surjective
418438
{φ : A →ₗ[R] B} (hφ : Function.Surjective φ) :
419439
moduleTopology R B = TopologicalSpace.coinduced φ inferInstance := by
420440
letI : TopologicalSpace B := moduleTopology R B
421441
haveI : IsModuleTopology R B := ⟨rfl⟩
422442
exact (isQuotientMap_of_surjective hφ).eq_coinduced
423443

444+
instance instQuot (S : Submodule R A) : IsModuleTopology R (A ⧸ S) := by
445+
constructor
446+
have := toContinuousAdd R A
447+
have quot := (Submodule.isOpenQuotientMap_mkQ S).isQuotientMap.eq_coinduced
448+
have module := ModuleTopology.eq_coinduced_of_surjective <| Submodule.mkQ_surjective S
449+
rw [quot, module]
450+
424451
end surjection
425452

426453
section Prod

0 commit comments

Comments
 (0)