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.Basic

Lorentz 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 section

Real contravariant Lorentz vector.

def Vector (d : := 3) := Fin 1 Fin d
instance {d} : AddCommMonoid (Vector d) := inferInstanceAs (AddCommMonoid (Fin 1 Fin d ))instance {d} : Module (Vector d) := inferInstanceAs (Module (Fin 1 Fin d ))instance {d} : AddCommGroup (Vector d) := inferInstanceAs (AddCommGroup (Fin 1 Fin d ))instance {d} : FiniteDimensional (Vector d) := inferInstanceAs (FiniteDimensional (Fin 1 Fin d ))

The equivalence between Vector d and EuclideanSpace ℝ (Fin 1 ⊕ Fin d).

def equivEuclid (d : ) : Vector d ≃ₗ[] EuclideanSpace (Fin 1 Fin d) := (WithLp.linearEquiv _ _ _).symm
@[simp] lemma equivEuclid_apply (d : ) (v : Vector d) (i : Fin 1 Fin d) : equivEuclid d v i = v i := rfl@[ext] lemma eq_of_apply_eq {d : } {v w : Vector d} (h : i, v i = w i) : v = w := d:v:Vector dw:Vector dh: (i : Fin 1 Fin d), v i = w iv = w d:v:Vector dw:Vector dh: (i : Fin 1 Fin d), v i = w i(equivEuclid d) v = (equivEuclid d) w d:v:Vector dw:Vector 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 (Vector d) where norm := fun v => equivEuclid d vlemma norm_eq_equivEuclid (d : ) (v : Vector d) : v = equivEuclid d v := rfl@[simp] lemma abs_component_le_norm {d : } (v : Vector d) (i : Fin 1 Fin d) : |v i| v := d:v:Vector di:Fin 1 Fin d|v i| v d:v:Vector di:Fin 1 Fin d|v i| (∑ x, v x ^ 2) d:v:Vector di:Fin 1 Fin dv i ^ 2 x, v x ^ 2 d:v:Vector di:Fin 1 Fin dv i ^ 2 j {i}, v j ^ 2d:v:Vector di:Fin 1 Fin d j {i}, v j ^ 2 x, v x ^ 2 d:v:Vector di:Fin 1 Fin dv i ^ 2 j {i}, v j ^ 2 All goals completed! 🐙 refine Finset.sum_le_univ_sum_of_nonneg (fun i => d:v:Vector di✝:Fin 1 Fin di:Fin 1 Fin d0 v i ^ 2 All goals completed! 🐙)All goals completed! 🐙instance isNormedSpace (d : ) : NormedSpace (Vector d) where norm_smul_le c v := d:c:v:Vector dc v c * v d:c:v:Vector dc (equivEuclid d) v c * (equivEuclid d) v All goals completed! 🐙instance (d : ) : Inner (Vector d) where inner := fun v w => equivEuclid d v, equivEuclid d w⟫_lemma inner_eq_equivEuclid (d : ) (v w : Vector d) : v, w⟫_ = equivEuclid d v, equivEuclid d w⟫_ := rfl

The Euclidean inner product structure on CoVector.

instance innerProductSpace (d : ) : InnerProductSpace (Vector d) where norm_sq_eq_re_inner v := d:v:Vector dv ^ 2 = RCLike.re v, v⟫_ d:v:Vector d(equivEuclid d) v ^ 2 = RCLike.re (equivEuclid d) v, (equivEuclid d) v⟫_ All goals completed! 🐙 conj_inner_symm x y := d:x:Vector dy:Vector d(starRingEnd ) y, x⟫_ = x, y⟫_ d:x:Vector dy:Vector d(starRingEnd ) (equivEuclid d) y, (equivEuclid d) x⟫_ = (equivEuclid d) x, (equivEuclid d) y⟫_ All goals completed! 🐙 add_left x y z := d:x:Vector dy:Vector dz:Vector dx + y, z⟫_ = x, z⟫_ + y, z⟫_ d:x:Vector dy:Vector dz:Vector d(equivEuclid d) x + (equivEuclid d) y, (equivEuclid d) z⟫_ = (equivEuclid d) x, (equivEuclid d) z⟫_ + (equivEuclid d) y, (equivEuclid d) z⟫_ All goals completed! 🐙 smul_left x y r := d:x:Vector dy:Vector dr:r x, y⟫_ = (starRingEnd ) r * x, y⟫_ d:x:Vector dy:Vector dr:r (equivEuclid d) x, (equivEuclid d) y⟫_ = (starRingEnd ) r * (equivEuclid d) x, (equivEuclid d) y⟫_ All goals completed! 🐙

The instance of a ChartedSpace on Vector d.

instance : ChartedSpace (Vector d) (Vector d) := chartedSpaceSelf (Vector d)
instance {d} : CoeFun (Vector d) (fun _ => Fin 1 Fin d ) where coe := fun v => vlemma ext_of_apply {d} {v w : Vector d} (h : i, v i = w i) : v = w := d:v:Vector dw:Vector dh: (i : Fin 1 Fin d), v i = w iv = w d:v:Vector dw:Vector dh: (i : Fin 1 Fin d), v i = w i(equivEuclid d) v = (equivEuclid d) w d:v:Vector dw:Vector 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! 🐙@[simp] lemma apply_smul {d : } (c : ) (v : Vector d) (i : Fin 1 Fin d) : (c v) i = c * v i := rfl@[simp] lemma apply_add {d : } (v w : Vector d) (i : Fin 1 Fin d) : (v + w) i = v i + w i := rfl@[simp] lemma apply_sub {d : } (v w : Vector d) (i : Fin 1 Fin d) : (v - w) i = v i - w i := d:v:Vector dw:Vector di:Fin 1 Fin d(v - w) i = v i - w i All goals completed! 🐙All goals completed! 🐙@[simp] lemma neg_apply {d : } (v : Vector d) (i : Fin 1 Fin d) : (-v) i = - v i := rfl@[simp] lemma zero_apply {d : } (i : Fin 1 Fin d) : (0 : Vector d) i = 0 := rfl

The continuous linear map from a Lorentz vector to one of its coordinates.

def coordCLM {d : } (i : Fin 1 Fin d) : Vector d →L[] := LinearMap.toContinuousLinearMap { toFun v := v i map_add' := d:i:Fin 1 Fin d (x y : Vector d), (x + y) i = x i + y i All goals completed! 🐙 map_smul' := d:i:Fin 1 Fin d (m : ) (x : Vector d), (m x) i = (RingHom.id ) m x i All goals completed! 🐙}
lemma coordCLM_apply {d : } (i : Fin 1 Fin d) (v : Vector d) : coordCLM i v = v i := rfl@[fun_prop] lemma coord_continuous {d : } (i : Fin 1 Fin d) : Continuous (fun v : Vector d => v i) := (coordCLM i).continuous@[fun_prop] lemma coord_contDiff {n} {d : } (i : Fin 1 Fin d) : ContDiff n (fun v : Vector d => v i) := (coordCLM i).contDiff@[fun_prop] lemma coord_differentiable {d : } (i : Fin 1 Fin d) : Differentiable (fun v : Vector d => v i) := (coordCLM i).differentiable@[fun_prop] lemma coord_differentiableAt {d : } (i : Fin 1 Fin d) (v : Vector d) : DifferentiableAt (fun v : Vector d => v i) v := (coordCLM i).differentiableAt

The continuous linear equivalence between Vector d and Euclidean space.

def euclidCLE (d : ) : Vector d ≃L[] EuclideanSpace (Fin 1 Fin d) := LinearEquiv.toContinuousLinearEquiv (equivEuclid d)

The continuous linear equivalence between Vector d and the corresponding Pi type.

def equivPi (d : ) : Vector d ≃L[] Π (_ : Fin 1 Fin d), := LinearEquiv.toContinuousLinearEquiv (LinearEquiv.refl _ _)
@[simp] lemma equivPi_apply {d : } (v : Vector d) (i : Fin 1 Fin d) : equivPi d v i = v i := rfld:α:Type u_1inst✝:TopologicalSpace αf:α Vector dh: (i : Fin 1 Fin d), Continuous fun x => f x iContinuous ((equivPi d) f) d:α:Type u_1inst✝:TopologicalSpace αf:α Vector dh: (i : Fin 1 Fin d), Continuous fun x => f x i (i : Fin 1 Fin d), Continuous fun a => ((equivPi d) f) a i d:α:Type u_1inst✝:TopologicalSpace αf:α Vector dh: (i : Fin 1 Fin d), Continuous fun x => f x ii:Fin 1 Fin dContinuous fun a => ((equivPi d) f) a i d:α:Type u_1inst✝:TopologicalSpace αf:α Vector dh: (i : Fin 1 Fin d), Continuous fun x => f x ii:Fin 1 Fin dContinuous fun a => f a i All goals completed! 🐙d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh: (i : Fin 1 Fin d), Differentiable fun x => f x iDifferentiable ((equivPi d) f) All goals completed! 🐙 d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dDifferentiable f (i : Fin 1 Fin d), Differentiable fun x => f x i d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:Differentiable fν:Fin 1 Fin dDifferentiable fun x => f x ν d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:Differentiable fν:Fin 1 Fin dDifferentiable ((coordCLM ν) f) d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:Differentiable fν:Fin 1 Fin dDifferentiable (coordCLM ν)d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:Differentiable fν:Fin 1 Fin dDifferentiable f d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:Differentiable fν:Fin 1 Fin dDifferentiable (coordCLM ν) All goals completed! 🐙 d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:Differentiable fν:Fin 1 Fin dDifferentiable f All goals completed! 🐙n:WithTop ℕ∞d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh: (i : Fin 1 Fin d), ContDiff n fun x => f x iContDiff n ((equivPi d) f) n:WithTop ℕ∞d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh: (i : Fin 1 Fin d), ContDiff n fun x => f x i (i : Fin 1 Fin d), ContDiff n fun x => ((equivPi d) f) x i n:WithTop ℕ∞d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh: (i : Fin 1 Fin d), ContDiff n fun x => f x iν:Fin 1 Fin dContDiff n fun x => ((equivPi d) f) x ν All goals completed! 🐙 n:WithTop ℕ∞d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dContDiff n f (i : Fin 1 Fin d), ContDiff n fun x => f x i n:WithTop ℕ∞d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:ContDiff n fν:Fin 1 Fin dContDiff n fun x => f x ν n:WithTop ℕ∞d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:ContDiff n fν:Fin 1 Fin dContDiff n ((coordCLM ν) f) n:WithTop ℕ∞d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:ContDiff n fν:Fin 1 Fin dContDiff n (coordCLM ν)n:WithTop ℕ∞d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:ContDiff n fν:Fin 1 Fin dContDiff n f n:WithTop ℕ∞d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:ContDiff n fν:Fin 1 Fin dContDiff n (coordCLM ν) All goals completed! 🐙 n:WithTop ℕ∞d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:ContDiff n fν:Fin 1 Fin dContDiff n f All goals completed! 🐙d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:Differentiable fx:αdt:αν:Fin 1 Fin d(fderiv f x) dt ν = (fderiv (⇑(coordCLM ν)) (f x) ∘SL fderiv f x) dt d:α:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace αf:α Vector dh:Differentiable fx:αdt:αν:Fin 1 Fin d(fderiv f x) dt ν = (coordCLM ν) ((fderiv f x) dt) All goals completed! 🐙@[simp] lemma fderiv_coord {d : } (μ : Fin 1 Fin d) (x : Vector d) : fderiv (fun v : Vector d => v μ) x = coordCLM μ := d:μ:Fin 1 Fin dx:Vector dfderiv (fun v => v μ) x = coordCLM μ d:μ:Fin 1 Fin dx:Vector dfderiv (⇑(coordCLM μ)) x = coordCLM μ All goals completed! 🐙

Basis

The basis on Vector d indexed by Fin 1 ⊕ Fin d.

def basis {d : } : Basis (Fin 1 Fin d) (Vector d) := Pi.basisFun _
@[simp] lemma basis_apply {d : } (μ ν : Fin 1 Fin d) : basis μ ν = if μ = ν then 1 else 0 := d:μ:Fin 1 Fin dν:Fin 1 Fin dbasis μ ν = if μ = ν then 1 else 0 d:μ:Fin 1 Fin dν:Fin 1 Fin d(Pi.basisFun (Fin 1 Fin d)) μ ν = if μ = ν then 1 else 0 erw [d:μ:Fin 1 Fin dν:Fin 1 Fin dPi.single μ 1 ν = if μ = ν then 1 else 0 d:μ:Fin 1 Fin dν:Fin 1 Fin d(if ν = μ then 1 else 0) = if μ = ν then 1 else 0d:μ: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(ν = μ) = (μ = ν) All goals completed! 🐙lemma basis_repr_apply {d : } (p : Vector d) (μ : Fin 1 Fin d) : basis.repr p μ = p μ := d:p:Vector dμ:Fin 1 Fin d(basis.repr p) μ = p μ d:p:Vector dμ:Fin 1 Fin d((Pi.basisFun (Fin 1 Fin d)).repr p) μ = p μ erw [d:p:Vector dμ:Fin 1 Fin dp μ = p μAll goals completed! 🐙lemma map_apply_eq_basis_mulVec {d : } (f : Vector d →ₗ[] Vector d) (p : Vector d) : (f p) = (LinearMap.toMatrix basis basis) f *ᵥ p := d:f:Vector d →ₗ[] Vector dp:Vector df p = (LinearMap.toMatrix basis basis) f *ᵥ p All goals completed! 🐙lemma sum_basis_eq_zero_iff {d : } (f : Fin 1 Fin d ) : ( μ, f μ basis μ) = 0 μ, f μ = 0 := d:f:Fin 1 Fin d μ, f μ basis μ = 0 (μ : Fin 1 Fin d), f μ = 0 d:f:Fin 1 Fin d μ, f μ basis μ = 0 (μ : Fin 1 Fin d), f μ = 0d:f:Fin 1 Fin d (∀ (μ : Fin 1 Fin d), f μ = 0) μ, f μ basis μ = 0 d:f:Fin 1 Fin d μ, f μ basis μ = 0 (μ : Fin 1 Fin d), f μ = 0 d:f:Fin 1 Fin d h: μ, f μ basis μ = 0 (μ : Fin 1 Fin d), f μ = 0 d:f:Fin 1 Fin d h: μ, f μ basis μ = 0h1: i Finset.univ, f i = 0 (μ : Fin 1 Fin d), f μ = 0 d:f:Fin 1 Fin d h: μ, f μ basis μ = 0h1: i Finset.univ, f i = 0μ:Fin 1 Fin df μ = 0 exact h1 μ (d:f:Fin 1 Fin d h: μ, f μ basis μ = 0h1: i Finset.univ, f i = 0μ:Fin 1 Fin dμ Finset.univ All goals completed! 🐙) d:f:Fin 1 Fin d (∀ (μ : Fin 1 Fin d), f μ = 0) μ, f μ basis μ = 0 d:f:Fin 1 Fin d h: (μ : Fin 1 Fin d), f μ = 0 μ, f μ basis μ = 0 All goals completed! 🐙d:f₀:f:Fin d f':Fin 1 Fin d := fun μ => match μ with | Sum.inl 0 => f₀ | Sum.inr i => f ih1:f₀ basis (Sum.inl 0) + i, f i basis (Sum.inr i) = μ, f' μ basis μ(∀ (μ : Fin 1 Fin d), f' μ = 0) f₀ = 0 (i : Fin d), f i = 0 All goals completed! 🐙

C. The Spatial part

Extract spatial components from a Lorentz vector, returning them as a vector in Euclidean space.

abbrev spatialPart {d : } (v : Vector d) : EuclideanSpace (Fin d) := WithLp.toLp 2 fun i => v (Sum.inr i)
lemma spatialPart_apply_eq_toCoord {d : } (v : Vector d) (i : Fin d) : spatialPart v i = v (Sum.inr i) := rfld:i:Fin dj:Fin d(if i = j then 1 else 0) = if Sum.inr i = Sum.inr j then 1 else 0 All goals completed! 🐙lemma spatialPart_basis_sum_inl {d : } (i : Fin d) : spatialPart (basis (Sum.inl 0)) i = 0 := d:i:Fin d(basis (Sum.inl 0)).spatialPart.ofLp i = 0 All goals completed! 🐙

The spatial part of a Lorentz vector as a continuous linear map.

def spatialCLM (d : ) : Vector d →L[] EuclideanSpace (Fin d) where toFun v := WithLp.toLp 2 fun i => v (Sum.inr i) map_add' v1 v2 := d:v1:Vector dv2:Vector d(WithLp.toLp 2 fun i => (v1 + v2) (Sum.inr i)) = (WithLp.toLp 2 fun i => v1 (Sum.inr i)) + WithLp.toLp 2 fun i => v2 (Sum.inr i) All goals completed! 🐙 map_smul' c v := d:c:v:Vector d(WithLp.toLp 2 fun i => (c v) (Sum.inr i)) = (RingHom.id ) c WithLp.toLp 2 fun i => v (Sum.inr i) All goals completed! 🐙 cont := d:Continuous fun v => WithLp.toLp 2 fun i => v (Sum.inr i) All goals completed! 🐙
lemma spatialCLM_apply_eq_spatialPart {d : } (v : Vector d) (i : Fin d) : spatialCLM d v i = spatialPart v i := rfl@[simp] lemma spatialCLM_basis_sum_inl {d : } : spatialCLM d (basis (Sum.inl 0)) = 0 := d:(spatialCLM d) (basis (Sum.inl 0)) = 0 d:i:Fin d((spatialCLM d) (basis (Sum.inl 0))).ofLp i = WithLp.ofLp 0 i All goals completed! 🐙d:i:Fin dj:Fin d(Finsupp.single (Sum.inr i) 1) (Sum.inr j) = ((EuclideanSpace.basisFun (Fin d) ) i).ofLp j d:i:Fin dj:Fin d(if i = j then 1 else 0) = if j = i then 1 else 0 d:i:Fin dj:Fin d(i = j) = (j = i) All goals completed! 🐙

The Temporal component

Extract time component from a Lorentz vector

abbrev timeComponent {d : } (v : Vector d) : := v (Sum.inl 0)
lemma timeComponent_basis_sum_inr {d : } (i : Fin d) : timeComponent (basis (Sum.inr i)) = 0 := d:i:Fin d(basis (Sum.inr i)).timeComponent = 0 All goals completed! 🐙lemma timeComponent_basis_sum_inl {d : } : timeComponent (d := d) (basis (Sum.inl 0)) = 1 := d:(basis (Sum.inl 0)).timeComponent = 1 All goals completed! 🐙

The temporal part of a Lorentz vector as a continuous linear map.

def temporalCLM (d : ) : Vector d →L[] := LinearMap.toContinuousLinearMap { toFun := fun v => v (Sum.inl 0) map_add' := d: (x y : Vector d), (x + y) (Sum.inl 0) = x (Sum.inl 0) + y (Sum.inl 0) All goals completed! 🐙 map_smul' := d: (m : ) (x : Vector d), (m x) (Sum.inl 0) = (RingHom.id ) m x (Sum.inl 0) All goals completed! 🐙}
lemma temporalCLM_apply_eq_timeComponent {d : } (v : Vector d) : temporalCLM d v = timeComponent v := rfl@[simp] lemma temporalCLM_basis_sum_inr {d : } (i : Fin d) : temporalCLM d (basis (Sum.inr i)) = 0 := d:i:Fin d(temporalCLM d) (basis (Sum.inr i)) = 0 All goals completed! 🐙@[simp] lemma temporalCLM_basis_sum_inl {d : } : temporalCLM d (basis (Sum.inl 0)) = 1 := d:(temporalCLM d) (basis (Sum.inl 0)) = 1 All goals completed! 🐙

The continuous linear map corresponding to the creation of a Lorentz Vector with only a non-zero temporal component.

def ofTemporalComponent {d : } : →L[] Vector d where toFun xt := xt basis (Sum.inl 0) map_add' := d: (x y : ), (x + y) basis (Sum.inl 0) = x basis (Sum.inl 0) + y basis (Sum.inl 0) All goals completed! 🐙 map_smul' := d: (m x : ), (m x) basis (Sum.inl 0) = (RingHom.id ) m x basis (Sum.inl 0) All goals completed! 🐙

The continuous linear map corresponding to the creation of a Lorentz Vector with only non-zero spatial components.

def ofSpatialComponent {d : } : EuclideanSpace (Fin d) →L[] Vector d where toFun xs := i, xs i basis (Sum.inr i) map_add' xs ys := d:xs:EuclideanSpace (Fin d)ys:EuclideanSpace (Fin d) i, (xs + ys).ofLp i basis (Sum.inr i) = i, xs.ofLp i basis (Sum.inr i) + i, ys.ofLp i basis (Sum.inr i) All goals completed! 🐙 map_smul' c xs := d:c:xs:EuclideanSpace (Fin d) i, (c xs).ofLp i basis (Sum.inr i) = (RingHom.id ) c i, xs.ofLp i basis (Sum.inr i) All goals completed! 🐙

## Smoothness

Properties of the inner product (note not the Minkowski product)

d:μ:Fin 1 Fin dp:Vector d i, ((equivEuclid d) (basis μ)).ofLp i, ((equivEuclid d) p).ofLp i⟫_ = p μ All goals completed! 🐙d:p:Vector dμ:Fin 1 Fin d i, ((equivEuclid d) p).ofLp i, ((equivEuclid d) (basis μ)).ofLp i⟫_ = p μ All goals completed! 🐙