Zulip Chat Archive

Stream: Is there code for X?

Topic: Inner product is bijective in both components


Yaël Dillies (Jul 06 2025 at 09:43):

I am trying to show that the inner product is a continuous perfect pairing (docs#LinearMap.IsContPerfPair). I could show that it is continuous in both arguments and bijective in the first, but I cannot seem to find the bijectivity in the second argument:

import Mathlib.Analysis.InnerProductSpace.Dual
import Mathlib.Topology.Algebra.Module.PerfectPairing

variable {E : Type*} [NormedAddCommGroup E] [InnerProductSpace  E] [CompleteSpace E]

instance : (innerₗ E).IsContPerfPair where
  continuous_uncurry := continuous_inner
  bijective_left := (InnerProductSpace.toDual  E).bijective
  bijective_right := sorry

Yaël Dillies (Jul 06 2025 at 09:44):

Is it possible somehow to reuse docs#InnerProductSpace.toDual for bijectivity in the second argument, by defining InnerOp E := E and ⟪x, y⟫ := ⟪y.ofInnerOp, x.ofInnerOp⟫ when x y : InnerOp E?

Yaël Dillies (Jul 06 2025 at 09:46):

As in, it is obviously possibly to do so for E a real inner product space, but I am not sure how the story goes for a complex inner product. Does ⟪x, y⟫ := conj ⟪y.ofInnerOp, x.ofInnerOp⟫ Just Work?

Kenny Lau (Jul 06 2025 at 10:25):

Yaël Dillies said:

As in, it is obviously possibly to do so for E a real inner product space, but I am not sure how the story goes for a complex inner product. Does ⟪x, y⟫ := conj ⟪y.ofInnerOp, x.ofInnerOp⟫ Just Work?

https://leanprover-community.github.io/mathlib4_docs/Mathlib/Analysis/InnerProductSpace/Basic.html#inner_conj_symm

(starRingEnd 𝕜) (inner 𝕜 y x) = inner 𝕜 x y

Yaël Dillies (Jul 06 2025 at 11:40):

Sure, yes, I guess there isn't much point to the type synonym

Kenny Lau (Jul 06 2025 at 11:42):

Why do you need the type synonym?

Yaël Dillies (Jul 06 2025 at 11:48):

Sorry, I went off for lunch without posting what I did. Here's what I came up with:

instance (innerₗ E).IsContPerfPair where
  continuous_uncurry := continuous_inner
  bijective_left := (InnerProductSpace.toDual  E).bijective
  bijective_right := by
    convert (InnerProductSpace.toDual  E).bijective
    ext y
    simp

Yaël Dillies (Jul 06 2025 at 11:49):

I still think the type synonym could be useful to dualise results about inner products. But I don't really need it here

Yaël Dillies (Jul 06 2025 at 11:49):

Here's the full code I wrote before throwing it away:

/-
Copyright (c) 2025 Yaël Dillies. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Yaël Dillies
-/
import Mathlib.Analysis.InnerProductSpace.Basic

/-!
# Inner opposite of an inner product space

For an inner product space `E`, this file defines ``
-/

variable {𝕜 E : Type*}

set_option linter.unusedVariables false in
/-- Type synonym for swapping the argument the arguments to the inner product of an inner product
space. -/
def InnerOp (𝕜 E : Type*) := E

section Defs
variable [SeminormedAddCommGroup E]

instance : SeminormedAddCommGroup (InnerOp 𝕜 E) := ‹_›

variable [RCLike 𝕜] [NormedSpace 𝕜 E]

instance : NormedSpace 𝕜 (InnerOp 𝕜 E) := ‹_›

variable (𝕜) in
/-- The linear isometry equivalence from `E` to `InnerOp 𝕜 E`. -/
def toInnerOp : E ≃ₗᵢ[𝕜] InnerOp 𝕜 E := .refl _ _

/-- The linear isometry equivalence from `InnerOp 𝕜 E` to `E`. -/
def ofInnerOp : InnerOp 𝕜 E ≃ₗᵢ[𝕜] E := .refl _ _

@[simp] lemma symm_toDual : (@toInnerOp 𝕜 E).symm = ofInnerOp := rfl
@[simp] lemma symm_ofInnerOp : (@ofInnerOp 𝕜 E).symm = toInnerOp 𝕜 := rfl
@[simp] lemma toInnerOp_ofInnerOp (x : InnerOp 𝕜 E) : toInnerOp 𝕜 (ofInnerOp x) = x := rfl
@[simp] lemma ofInnerOp_toInnerOp (x : E) : ofInnerOp (toInnerOp 𝕜 x) = x := rfl

lemma toInnerOp_inj {x y : E} : toInnerOp 𝕜 x = toInnerOp 𝕜 y  x = y := .rfl
lemma ofInnerOp_inj {x y : InnerOp 𝕜 E} : ofInnerOp x = ofInnerOp y  x = y := .rfl

lemma InnerOp.forall {P : InnerOp 𝕜 E  Prop} : ( x, P x)   x, P (toInnerOp 𝕜 x) := .rfl

end Defs

instance [NormedAddCommGroup E] : NormedAddCommGroup (InnerOp 𝕜 E) := ‹_›

variable [RCLike 𝕜] [SeminormedAddCommGroup E] [InnerProductSpace 𝕜 E]

instance : InnerProductSpace 𝕜 (InnerOp 𝕜 E) where
  inner x y := star <| inner 𝕜 (ofInnerOp y) (ofInnerOp x)
  norm_sq_eq_re_inner := by simp [ norm_sq_eq_re_inner]
  conj_inner_symm := by simp
  add_left := by simp [inner_add_right]
  smul_left := by simp [inner_smul_right]

Kenny Lau (Jul 06 2025 at 11:56):

but where's the bijective stuff?

Yaël Dillies (Jul 06 2025 at 12:00):

Sorry, wdym? Isn't it the proof of bijective_right above?

Kenny Lau (Jul 06 2025 at 12:04):

I meant that it's not in your full code

Yaël Dillies (Jul 06 2025 at 12:04):

Ah sure, I threw it away before using it


Last updated: Dec 20 2025 at 21:32 UTC