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
Ea 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?
(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