Zulip Chat Archive

Stream: maths

Topic: Last step; Smoothness of vector bundle of alternating maps


Sam Lindauer (Feb 17 2025 at 16:40):

Hey all,

I am working on differential forms. They are defined using the smooth vector bundle of continuous alternating maps. Definitionally, this is finished. I am only missing a part of the proof of smoothness for the vector bundle of continuous alternating maps. See #mwe below (it is quite long because some of the necessary definitions and instances are not yet in mathlib).

Any help or insight is sincerely appreciated!

Sam

import Mathlib

noncomputable section

open scoped Manifold

variable {π•œ ΞΉ E F G : Type*}
  [NontriviallyNormedField π•œ] [Fintype ΞΉ]
  [NormedAddCommGroup E] [NormedSpace π•œ E]
  [NormedAddCommGroup F] [NormedSpace π•œ F]
  [NormedAddCommGroup G] [NormedSpace π•œ G]

/- Additional setup from different Mathlib branch -/
instance instSeminormedAddCommGroup : SeminormedAddCommGroup (E [β‹€^ΞΉ]β†’L[π•œ] F) where
  toPseudoMetricSpace := .induced ContinuousAlternatingMap.toContinuousMultilinearMap inferInstance
  __ := SeminormedAddCommGroup.induced _ _ (ContinuousAlternatingMap.toMultilinearAddHom : E [β‹€^ΞΉ]β†’L[π•œ] F β†’+ _)
  norm f := β€–f.toContinuousMultilinearMapβ€–

@[simp] theorem norm_toContinuousMultilinearMap (f : E [β‹€^ΞΉ]β†’L[π•œ] F) : β€–f.1β€– = β€–fβ€– := rfl

theorem ContinuousAlternatingMap.norm_compContinuousLinearMap_le (f : F [β‹€^ΞΉ]β†’L[π•œ] G)
    (g : E β†’L[π•œ] F) : β€–f.compContinuousLinearMap gβ€– ≀ β€–fβ€– * (β€–gβ€– ^ Fintype.card ΞΉ) :=
  (f.1.norm_compContinuousLinearMap_le _).trans_eq <| by simp

instance normedAddCommGroup : NormedAddCommGroup (E [β‹€^ΞΉ]β†’L[π•œ] F) :=
  NormedAddCommGroup.ofSeparation fun _f hf ↦
    ContinuousAlternatingMap.toContinuousMultilinearMap_injective <| norm_eq_zero.mp hf

instance instNormedSpace {π•œ' : Type*} [NormedField π•œ'] [NormedSpace π•œ' F] [SMulCommClass π•œ π•œ' F] :
    NormedSpace π•œ' (E [β‹€^ΞΉ]β†’L[π•œ] F) :=
  ⟨fun c f ↦ f.1.opNorm_smul_le c⟩

/- Function definition -/
def ContinuousAlternatingMap.compContinuousLinearMapCLM (f : E β†’L[π•œ] F) :
    (F [β‹€^ΞΉ]β†’L[π•œ] G) β†’L[π•œ] (E [β‹€^ΞΉ]β†’L[π•œ] G) :=
  LinearMap.mkContinuous
    (ContinuousAlternatingMap.compContinuousLinearMapβ‚— f) (β€–fβ€– ^ Fintype.card ΞΉ) fun g ↦
      (g.norm_compContinuousLinearMap_le f).trans_eq (mul_comm _ _)

/- Proof of smoothness -/
theorem ContinuousAlternatingMap.compContinuousLinearMapCLM_contMDiff :
    ContMDiff π“˜(π•œ, (E β†’L[π•œ] E)) π“˜(π•œ, ((E [β‹€^ΞΉ]β†’L[π•œ] G) β†’L[π•œ] (E [β‹€^ΞΉ]β†’L[π•œ] G))) ⊀
      (fun (p : (E β†’L[π•œ] E)) ↦ (ContinuousAlternatingMap.compContinuousLinearMapCLM p :
        ((E [β‹€^ΞΉ]β†’L[π•œ] G) β†’L[π•œ] (E [β‹€^ΞΉ]β†’L[π•œ] G)))) := by
  sorry

Patrick Massot (Feb 17 2025 at 16:46):

@Floris van Doorn or @Heather Macbeth can probably help.

SΓ©bastien GouΓ«zel (Feb 17 2025 at 16:57):

I'm working on this.

SΓ©bastien GouΓ«zel (Feb 19 2025 at 16:39):

In #22089, there is the following theorem:

lemma analyticOn_uncurry_compContinuousLinearMap :
    AnalyticOn π•œ (fun (p : (Ξ  i, Fm i β†’L[π•œ] Em i) Γ— (ContinuousMultilinearMap π•œ Em G))
      ↦ p.2.compContinuousLinearMap p.1) t := ...

Hopefully, you can proceed from there (taking inspiration from the proof if needed, or writing your map as the composition of this one, and linear maps).

Unfortunately, #22089 uncovered some API gaps, so it will take some time (and I will need to split it into several PRs) before it can get in.

SΓ©bastien GouΓ«zel (Feb 19 2025 at 20:46):

The first PR towards this is #22102, which splits the file CPolynomial.lean in two. This is necessary before further refactors. This is purely a splitting PR, so essentially trivial.

Sam Lindauer (Feb 20 2025 at 11:03):

I'll try to implement this at a later date, you'll hear from me if I managed or not. Thanks immensely for your time, this will surely help!

SΓ©bastien GouΓ«zel (Feb 21 2025 at 10:36):

The analyticity is proved in #22089. I can split it if it helps, but since it's only +317/-53, I think it makes sense to keep everyting in one single PR.

Patrick Massot (Feb 21 2025 at 11:19):

I am surprised to see no fun_prop annotation anywhere in this PR. Is there something that blocks fun_prop here?

SΓ©bastien GouΓ«zel (Feb 21 2025 at 12:09):

As far as I can tell, fun_prop is not used for CPolynomialAt, which is the bulk of the PR. More importantly, what I prove is

AnalyticAt π•œ (fun (p : (Ξ  i, Fm i β†’L[π•œ] Em i) Γ— (ContinuousMultilinearMap π•œ Em G))
      ↦ p.2.compContinuousLinearMap p.1) q

but this one is not a good candidate for fun_prop: it should rather be the compositional version saying that, if f and g are analytic, then x ↦ (f x).compContinuousLinearMap (g x) is analytic. Except that the original poster doesn't need this version, but rather the version in C^k smoothness. It would make sense to add all these, but the PR is already pretty long. Tell me if you want me to add them to the PR nevertheless!

Patrick Massot (Feb 21 2025 at 13:46):

Yes, my question is precisely: why don’t we use fun_prop for CPolynomialAt?

SΓ©bastien GouΓ«zel (Feb 21 2025 at 14:21):

That's a good question, but that would be for another PR.

Sam Lindauer (Mar 21 2025 at 12:08):

I have the feeling I am almost there, @SΓ©bastien GouΓ«zel . At this point, I have proven an auxiliary lemma that proves a close relative to what we want to prove for continuous multilinear maps, namely the following (it fits into the #mwe above)

theorem ContinuousMultilinearMap.compContinuousLinearMapL_diag_contDiff :
  ContDiff π•œ ⊀ (fun p : E β†’L[π•œ] E ↦
  (ContinuousMultilinearMap.compContinuousLinearMapL (fun _ : ΞΉ ↦ p) :
    ContinuousMultilinearMap π•œ (fun _ ↦ E) G β†’L[π•œ] ContinuousMultilinearMap π•œ (fun _ ↦ E) G)) := by
  let Ο† : ContinuousMultilinearMap π•œ (fun _ : ΞΉ ↦ E β†’L[π•œ] E) _ :=
    ContinuousMultilinearMap.compContinuousLinearMapContinuousMultilinear
    π•œ (fun _ : ΞΉ ↦ E) (fun _ : ΞΉ ↦ E) G
  show ContDiff π•œ ⊀ (fun p : E β†’L[π•œ] E ↦ Ο† (fun _ : ΞΉ ↦ p))
  apply ContDiff.comp
  Β· apply ContinuousMultilinearMap.contDiff
  Β· apply contDiff_pi.mpr
    intro _
    apply contDiff_id

Then, I have created a linear equivalence between alternating and multilinear maps using the inclusion and the alternatization as follows (not fully proven yet, fits into #mwe above if [DecidableEq ΞΉ] is added).

def _root_.ContinuousLinearEquiv.ContinuousAlternatingMapContinuousMultilinearMapEquiv :
    (E [β‹€^ΞΉ]β†’L[π•œ] G) ≃L[π•œ] (ContinuousMultilinearMap π•œ (ΞΉ := ΞΉ) (fun x ↦ E) G) where
  toFun := ContinuousAlternatingMap.toContinuousMultilinearMap
  invFun := ContinuousMultilinearMap.alternatization
  map_add' _ _ := rfl
  map_smul' _ _ := rfl
  left_inv := sorry
  right_inv := sorry
  continuous_toFun := ContinuousAlternatingMap.continuous_toContinuousMultilinearMap
  continuous_invFun := sorry

Finally, I have gotten the proof of the theorem up to a similar statement to ContinuousMultilinearMap.compContinuousLinearMapL_diag_contDiff but the closing step eludes me. This is the proof so far (also needs [DecidableEq ΞΉ] to fit into #mwe):

theorem ContinuousAlternatingMap.compContinuousLinearMapCLM_contMDiff :
    ContMDiff π“˜(π•œ, (E β†’L[π•œ] E)) π“˜(π•œ, ((E [β‹€^ΞΉ]β†’L[π•œ] G) β†’L[π•œ] (E [β‹€^ΞΉ]β†’L[π•œ] G))) ⊀
      (fun (p : (E β†’L[π•œ] E)) ↦ (ContinuousAlternatingMap.compContinuousLinearMapCLM p :
        ((E [β‹€^ΞΉ]β†’L[π•œ] G) β†’L[π•œ] (E [β‹€^ΞΉ]β†’L[π•œ] G)))) := by
  rw [contMDiff_iff_contDiff]
  let ΞΈ : (E [β‹€^ΞΉ]β†’L[π•œ] G) ≃L[π•œ] (ContinuousMultilinearMap π•œ (ΞΉ := ΞΉ) (fun x ↦ E) G) :=
    ContinuousLinearEquiv.ContinuousAlternatingMapContinuousMultilinearMapEquiv
  let Θ : ((E [β‹€^ΞΉ]β†’L[π•œ] G) β†’L[π•œ] (E [β‹€^ΞΉ]β†’L[π•œ] G)) ≃L[π•œ]
    ((ContinuousMultilinearMap π•œ (ΞΉ := ΞΉ) (fun x ↦ E) G) β†’L[π•œ]
      (ContinuousMultilinearMap π•œ (ΞΉ := ΞΉ) (fun x ↦ E) G)) :=
        ContinuousLinearEquiv.arrowCongr ΞΈ ΞΈ
  rw[← ContinuousLinearEquiv.comp_contDiff_iff (π•œ := π•œ)
    (F := ((E [β‹€^ΞΉ]β†’L[π•œ] G) β†’L[π•œ] (E [β‹€^ΞΉ]β†’L[π•œ] G)))
    (G := ((ContinuousMultilinearMap π•œ (ΞΉ := ΞΉ) (fun x ↦ E) G) β†’L[π•œ]
      (ContinuousMultilinearMap π•œ (ΞΉ := ΞΉ) (fun x ↦ E) G))) Θ]
  sorry

Thanks in advance!

Sam Lindauer (Mar 21 2025 at 12:09):

In case that helps, here is the full #mwe :

import Mathlib

noncomputable section

open scoped Manifold

variable {π•œ ΞΉ E F G : Type*}
  [NontriviallyNormedField π•œ]
  [Fintype ΞΉ]
  [NormedAddCommGroup E] [NormedSpace π•œ E]
  [NormedAddCommGroup F] [NormedSpace π•œ F]
  [NormedAddCommGroup G] [NormedSpace π•œ G]

/- Additional setup from different Mathlib branch -/
instance instSeminormedAddCommGroup : SeminormedAddCommGroup (E [β‹€^ΞΉ]β†’L[π•œ] F) where
  toPseudoMetricSpace := .induced ContinuousAlternatingMap.toContinuousMultilinearMap inferInstance
  __ := SeminormedAddCommGroup.induced _ _ (ContinuousAlternatingMap.toMultilinearAddHom : E [β‹€^ΞΉ]β†’L[π•œ] F β†’+ _)
  norm f := β€–f.toContinuousMultilinearMapβ€–

@[simp] theorem norm_toContinuousMultilinearMap (f : E [β‹€^ΞΉ]β†’L[π•œ] F) : β€–f.1β€– = β€–fβ€– := rfl

theorem ContinuousAlternatingMap.norm_compContinuousLinearMap_le (f : F [β‹€^ΞΉ]β†’L[π•œ] G)
    (g : E β†’L[π•œ] F) : β€–f.compContinuousLinearMap gβ€– ≀ β€–fβ€– * (β€–gβ€– ^ Fintype.card ΞΉ) :=
  (f.1.norm_compContinuousLinearMap_le _).trans_eq <| by simp

instance normedAddCommGroup : NormedAddCommGroup (E [β‹€^ΞΉ]β†’L[π•œ] F) :=
  NormedAddCommGroup.ofSeparation fun _f hf ↦
    ContinuousAlternatingMap.toContinuousMultilinearMap_injective <| norm_eq_zero.mp hf

instance instNormedSpace {π•œ' : Type*} [NormedField π•œ'] [NormedSpace π•œ' F] [SMulCommClass π•œ π•œ' F] :
    NormedSpace π•œ' (E [β‹€^ΞΉ]β†’L[π•œ] F) :=
  ⟨fun c f ↦ f.1.opNorm_smul_le c⟩

/- Function definition -/
def ContinuousAlternatingMap.compContinuousLinearMapCLM (f : E β†’L[π•œ] F) :
    (F [β‹€^ΞΉ]β†’L[π•œ] G) β†’L[π•œ] (E [β‹€^ΞΉ]β†’L[π•œ] G) :=
  LinearMap.mkContinuous
    (ContinuousAlternatingMap.compContinuousLinearMapβ‚— f) (β€–fβ€– ^ Fintype.card ΞΉ) fun g ↦
      (g.norm_compContinuousLinearMap_le f).trans_eq (mul_comm _ _)

theorem ContinuousMultilinearMap.compContinuousLinearMapL_diag_contDiff :
  ContDiff π•œ ⊀ (fun p : E β†’L[π•œ] E ↦
  (ContinuousMultilinearMap.compContinuousLinearMapL (fun _ : ΞΉ ↦ p) :
    ContinuousMultilinearMap π•œ (fun _ ↦ E) G β†’L[π•œ] ContinuousMultilinearMap π•œ (fun _ ↦ E) G)) := by
  let Ο† : ContinuousMultilinearMap π•œ (fun _ : ΞΉ ↦ E β†’L[π•œ] E) _ :=
    ContinuousMultilinearMap.compContinuousLinearMapContinuousMultilinear
    π•œ (fun _ : ΞΉ ↦ E) (fun _ : ΞΉ ↦ E) G
  show ContDiff π•œ ⊀ (fun p : E β†’L[π•œ] E ↦ Ο† (fun _ : ΞΉ ↦ p))
  apply ContDiff.comp
  Β· apply ContinuousMultilinearMap.contDiff
  Β· apply contDiff_pi.mpr
    intro _
    apply contDiff_id

variable [DecidableEq ΞΉ]

def _root_.ContinuousLinearEquiv.ContinuousAlternatingMapContinuousMultilinearMapEquiv :
    (E [β‹€^ΞΉ]β†’L[π•œ] G) ≃L[π•œ] (ContinuousMultilinearMap π•œ (ΞΉ := ΞΉ) (fun x ↦ E) G) where
  toFun := ContinuousAlternatingMap.toContinuousMultilinearMap
  invFun := ContinuousMultilinearMap.alternatization
  map_add' _ _ := rfl
  map_smul' _ _ := rfl
  left_inv := sorry
  right_inv := sorry
  continuous_toFun := ContinuousAlternatingMap.continuous_toContinuousMultilinearMap
  continuous_invFun := sorry

/- Proof of smoothness -/
theorem ContinuousAlternatingMap.compContinuousLinearMapCLM_contMDiff :
    ContMDiff π“˜(π•œ, (E β†’L[π•œ] E)) π“˜(π•œ, ((E [β‹€^ΞΉ]β†’L[π•œ] G) β†’L[π•œ] (E [β‹€^ΞΉ]β†’L[π•œ] G))) ⊀
      (fun (p : (E β†’L[π•œ] E)) ↦ (ContinuousAlternatingMap.compContinuousLinearMapCLM p :
        ((E [β‹€^ΞΉ]β†’L[π•œ] G) β†’L[π•œ] (E [β‹€^ΞΉ]β†’L[π•œ] G)))) := by
  rw [contMDiff_iff_contDiff]
  let ΞΈ : (E [β‹€^ΞΉ]β†’L[π•œ] G) ≃L[π•œ] (ContinuousMultilinearMap π•œ (ΞΉ := ΞΉ) (fun x ↦ E) G) :=
    ContinuousLinearEquiv.ContinuousAlternatingMapContinuousMultilinearMapEquiv
  let Θ : ((E [β‹€^ΞΉ]β†’L[π•œ] G) β†’L[π•œ] (E [β‹€^ΞΉ]β†’L[π•œ] G)) ≃L[π•œ]
    ((ContinuousMultilinearMap π•œ (ΞΉ := ΞΉ) (fun x ↦ E) G) β†’L[π•œ]
      (ContinuousMultilinearMap π•œ (ΞΉ := ΞΉ) (fun x ↦ E) G)) :=
        ContinuousLinearEquiv.arrowCongr ΞΈ ΞΈ
  rw[← ContinuousLinearEquiv.comp_contDiff_iff (π•œ := π•œ)
    (F := ((E [β‹€^ΞΉ]β†’L[π•œ] G) β†’L[π•œ] (E [β‹€^ΞΉ]β†’L[π•œ] G)))
    (G := ((ContinuousMultilinearMap π•œ (ΞΉ := ΞΉ) (fun x ↦ E) G) β†’L[π•œ]
      (ContinuousMultilinearMap π•œ (ΞΉ := ΞΉ) (fun x ↦ E) G))) Θ]
  sorry

SΓ©bastien GouΓ«zel (Mar 21 2025 at 12:23):

Sam Lindauer said:

Then, I have created a linear equivalence between alternating and multilinear maps using the inclusion and the alternatization as follows (not fully proven yet, fits into #mwe above if [DecidableEq ΞΉ] is added).

This can not be correct, unfortunately: there are more multilinear maps than alternating maps, so you can't have such an equivalence (for dimension reasons, for instance). What you should do instead is build on the space of alternative maps the analogues of the results we have for multilinear maps (possibly using the multilinear maps version, and then proving that what you get is alternating).

Sam Lindauer (Mar 21 2025 at 13:01):

SΓ©bastien GouΓ«zel said:

Sam Lindauer said:

Then, I have created a linear equivalence between alternating and multilinear maps using the inclusion and the alternatization as follows (not fully proven yet, fits into #mwe above if [DecidableEq ΞΉ] is added).

This can not be correct, unfortunately: there are more multilinear maps than alternating maps, so you can't have such an equivalence (for dimension reasons, for instance). What you should do instead is build on the space of alternative maps the analogues of the results we have for multilinear maps (possibly using the multilinear maps version, and then proving that what you get is alternating).

I see, I was bit skeptical already, but good to have it assured. It's a bit bigger of a task than I initially expected then. Thanks for your quick reply!


Last updated: May 02 2025 at 03:31 UTC