Imports
/-
Copyright (c) 2025 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Matteo Cipollina, Joseph Tooby-Smith
-/
module
public import Mathlib.Analysis.InnerProductSpace.PiL2
public import Mathlib.Geometry.Manifold.IsManifold.BasicLorentz co vectors
In this module we define Lorentz vectors as real Lorentz tensors with a single up index. We create an API around Lorentz vectors to make working with them as easy as possible.
@[expose] public sectionReal contravariant Lorentz vector.
def CoVector (d : ℕ := 3) := Fin 1 ⊕ Fin d → ℝinstance {d} : AddCommMonoid (CoVector d) :=
inferInstanceAs (AddCommMonoid (Fin 1 ⊕ Fin d → ℝ))instance {d} : Module ℝ (CoVector d) :=
inferInstanceAs (Module ℝ (Fin 1 ⊕ Fin d → ℝ))instance {d} : AddCommGroup (CoVector d) :=
inferInstanceAs (AddCommGroup (Fin 1 ⊕ Fin d → ℝ))instance {d} : FiniteDimensional ℝ (CoVector d) :=
inferInstanceAs (FiniteDimensional ℝ (Fin 1 ⊕ Fin d → ℝ))
The equivalence between CoVector d and EuclideanSpace ℝ (Fin 1 ⊕ Fin d).
def equivEuclid (d : ℕ) :
CoVector d ≃ₗ[ℝ] EuclideanSpace ℝ (Fin 1 ⊕ Fin d) :=
(WithLp.linearEquiv _ _ _).symm@[ext]
lemma eq_of_apply_eq {d : ℕ} {v w : CoVector d} (h : ∀ i, v i = w i) : v = w := d:ℕv:CoVector dw:CoVector dh:∀ (i : Fin 1 ⊕ Fin d), v i = w i⊢ v = w
d:ℕv:CoVector dw:CoVector dh:∀ (i : Fin 1 ⊕ Fin d), v i = w i⊢ (equivEuclid d) v = (equivEuclid d) w
d:ℕv:CoVector dw:CoVector dh:∀ (i : Fin 1 ⊕ Fin d), v i = w ii:Fin 1 ⊕ Fin d⊢ ((equivEuclid d) v).ofLp i = ((equivEuclid d) w).ofLp i
All goals completed! 🐙instance (d : ℕ) : Norm (CoVector d) where
norm := fun v => ‖equivEuclid d v‖lemma norm_eq_equivEuclid (d : ℕ) (v : CoVector d) :
‖v‖ = ‖equivEuclid d v‖ := rflAll goals completed! 🐙instance isNormedSpace (d : ℕ) : NormedSpace ℝ (CoVector d) where
norm_smul_le c v := by d:ℕc:ℝv:CoVector d⊢ ‖c • v‖ ≤ ‖c‖ * ‖v‖
simp only [norm_eq_equivEuclid, map_smul] d:ℕc:ℝv:CoVector d⊢ ‖c • (equivEuclid d) v‖ ≤ ‖c‖ * ‖(equivEuclid d) v‖
exact norm_smul_le c (equivEuclid d v) All goals completed! 🐙instance (d : ℕ) : Inner ℝ (CoVector d) where
inner := fun v w => ⟪equivEuclid d v, equivEuclid d w⟫_ℝlemma inner_eq_equivEuclid (d : ℕ) (v w : CoVector d) :
⟪v, w⟫_ℝ = ⟪equivEuclid d v, equivEuclid d w⟫_ℝ := rfl
The Euclidean inner product structure on CoVector.
instance innerProductSpace (d : ℕ) : InnerProductSpace ℝ (CoVector d) where
norm_sq_eq_re_inner v := by d:ℕv:CoVector d⊢ ‖v‖ ^ 2 = RCLike.re ⟪v, v⟫_ℝ
simp only [inner_eq_equivEuclid, norm_eq_equivEuclid] d:ℕv:CoVector d⊢ ‖(equivEuclid d) v‖ ^ 2 = RCLike.re ⟪(equivEuclid d) v, (equivEuclid d) v⟫_ℝ
exact InnerProductSpace.norm_sq_eq_re_inner (equivEuclid d v) All goals completed! 🐙
conj_inner_symm x y := by d:ℕx:CoVector dy:CoVector d⊢ (starRingEnd ℝ) ⟪y, x⟫_ℝ = ⟪x, y⟫_ℝ
simp only [inner_eq_equivEuclid] d:ℕx:CoVector dy:CoVector d⊢ (starRingEnd ℝ) ⟪(equivEuclid d) y, (equivEuclid d) x⟫_ℝ = ⟪(equivEuclid d) x, (equivEuclid d) y⟫_ℝ
exact InnerProductSpace.conj_inner_symm (equivEuclid d x) (equivEuclid d y) All goals completed! 🐙
add_left x y z := by d:ℕx:CoVector dy:CoVector dz:CoVector d⊢ ⟪x + y, z⟫_ℝ = ⟪x, z⟫_ℝ + ⟪y, z⟫_ℝ
simp only [inner_eq_equivEuclid, map_add] d:ℕx:CoVector dy:CoVector dz:CoVector d⊢ ⟪(equivEuclid d) x + (equivEuclid d) y, (equivEuclid d) z⟫_ℝ =
⟪(equivEuclid d) x, (equivEuclid d) z⟫_ℝ + ⟪(equivEuclid d) y, (equivEuclid d) z⟫_ℝ
exact InnerProductSpace.add_left (equivEuclid d x) (equivEuclid d y) (equivEuclid d z) All goals completed! 🐙
smul_left x y r := by d:ℕx:CoVector dy:CoVector dr:ℝ⊢ ⟪r • x, y⟫_ℝ = (starRingEnd ℝ) r * ⟪x, y⟫_ℝ
simp only [inner_eq_equivEuclid, map_smul] d:ℕx:CoVector dy:CoVector dr:ℝ⊢ ⟪r • (equivEuclid d) x, (equivEuclid d) y⟫_ℝ = (starRingEnd ℝ) r * ⟪(equivEuclid d) x, (equivEuclid d) y⟫_ℝ
exact InnerProductSpace.smul_left (equivEuclid d x) (equivEuclid d y) r All goals completed! 🐙
The instance of a ChartedSpace on Vector d.
instance {d} : CoeFun (CoVector d) (fun _ => Fin 1 ⊕ Fin d → ℝ) where
coe := fun v => v@[simp]
lemma apply_smul {d : ℕ} (c : ℝ) (v : CoVector d) (i : Fin 1 ⊕ Fin d) :
(c • v) i = c * v i := rfl@[simp]
lemma apply_add {d : ℕ} (v w : CoVector d) (i : Fin 1 ⊕ Fin d) :
(v + w) i = v i + w i := rfl@[simp]
lemma apply_sub {d : ℕ} (v w : CoVector d) (i : Fin 1 ⊕ Fin d) :
(v - w) i = v i - w i := by d:ℕv:CoVector dw:CoVector di:Fin 1 ⊕ Fin d⊢ (v - w) i = v i - w i rfl All goals completed! 🐙@[simp]
lemma apply_sum {d : ℕ} {ι : Type} [Fintype ι] (f : ι → CoVector d) (i : Fin 1 ⊕ Fin d) :
(∑ j, f j) i = ∑ j, f j i := Finset.sum_apply i Finset.univ f@[simp]
lemma neg_apply {d : ℕ} (v : CoVector d) (i : Fin 1 ⊕ Fin d) :
(-v) i = - v i := rfl@[simp]
lemma zero_apply {d : ℕ} (i : Fin 1 ⊕ Fin d) :
(0 : CoVector d) i = 0 := rflBasis
The basis on Vector d indexed by Fin 1 ⊕ Fin d.
def basis {d : ℕ} : Basis (Fin 1 ⊕ Fin d) ℝ (CoVector d) :=
Pi.basisFun ℝ _@[simp]
lemma basis_apply {d : ℕ} (μ ν : Fin 1 ⊕ Fin d) :
basis μ ν = if μ = ν then 1 else 0 := by d:ℕμ:Fin 1 ⊕ Fin dν:Fin 1 ⊕ Fin d⊢ basis μ ν = if μ = ν then 1 else 0
simp [basis] d:ℕμ:Fin 1 ⊕ Fin dν:Fin 1 ⊕ Fin d⊢ (Pi.basisFun ℝ (Fin 1 ⊕ Fin d)) μ ν = if μ = ν then 1 else 0
erw [Pi.basisFun_apply, d:ℕμ:Fin 1 ⊕ Fin dν:Fin 1 ⊕ Fin d⊢ Pi.single μ 1 ν = if μ = ν then 1 else 0 Pi.single_apply d:ℕμ:Fin 1 ⊕ Fin dν:Fin 1 ⊕ Fin d⊢ (if ν = μ then 1 else 0) = if μ = ν then 1 else 0] d:ℕμ:Fin 1 ⊕ Fin dν:Fin 1 ⊕ Fin d⊢ (if ν = μ then 1 else 0) = if μ = ν then 1 else 0
congr 1 e_c d:ℕμ:Fin 1 ⊕ Fin dν:Fin 1 ⊕ Fin d⊢ (ν = μ) = (μ = ν)
exact Lean.Grind.eq_congr' rfl rfl All goals completed! 🐙lemma basis_repr_apply {d : ℕ} (p : CoVector d) (μ : Fin 1 ⊕ Fin d) :
basis.repr p μ = p μ := by d:ℕp:CoVector dμ:Fin 1 ⊕ Fin d⊢ (basis.repr p) μ = p μ
simp [basis] d:ℕp:CoVector dμ:Fin 1 ⊕ Fin d⊢ ((Pi.basisFun ℝ (Fin 1 ⊕ Fin d)).repr p) μ = p μ
erw [Pi.basisFun_repr d:ℕp:CoVector dμ:Fin 1 ⊕ Fin d⊢ p μ = p μ] All goals completed! 🐙lemma map_apply_eq_basis_mulVec {d : ℕ} (f : CoVector d →ₗ[ℝ] CoVector d) (p : CoVector d) :
(f p) = (LinearMap.toMatrix basis basis) f *ᵥ p := by d:ℕf:CoVector d →ₗ[ℝ] CoVector dp:CoVector d⊢ f p = (LinearMap.toMatrix basis basis) f *ᵥ p
exact Eq.symm (LinearMap.toMatrix_mulVec_repr basis basis f p) All goals completed! 🐙