Imports
/- Copyright (c) 2026 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 Physlib.Relativity.Tensors.RealTensor.Basic public import Physlib.Relativity.Tensors.RealTensor.Vector.Basic

Tensorial nature of Lorentz vectors

We define the tensorial instance on Lorentz.Vector, and show prove properties related to the Lorentz group action and the basis.

@[expose] public section

Tensorial

The equivalence between the type of indices of a Lorentz vector and Fin 1 ⊕ Fin d.

def indexEquiv {d : } : ComponentIdx (S := (realLorentzTensor d)) ![Color.up] Fin 1 Fin d := ComponentIdx.single (S := realLorentzTensor d) (c := Color.up)
instance tensorial {d : } : Tensorial (realLorentzTensor d) ![.up] (Vector d) where toTensor := LinearEquiv.symm <| Equiv.toLinearEquiv ((Tensor.basis (S := (realLorentzTensor d)) ![.up]).repr.toEquiv.trans <| Finsupp.equivFunOnFinite.trans <| (Equiv.piCongrLeft' _ indexEquiv)) { map_add := fun x y => d:x:(realLorentzTensor d).Tensor ![Color.up]y:(realLorentzTensor d).Tensor ![Color.up]((Tensor.basis ![Color.up]).repr.toEquiv.trans (Finsupp.equivFunOnFinite.trans (Equiv.piCongrLeft' (fun a => ) indexEquiv))) (x + y) = ((Tensor.basis ![Color.up]).repr.toEquiv.trans (Finsupp.equivFunOnFinite.trans (Equiv.piCongrLeft' (fun a => ) indexEquiv))) x + ((Tensor.basis ![Color.up]).repr.toEquiv.trans (Finsupp.equivFunOnFinite.trans (Equiv.piCongrLeft' (fun a => ) indexEquiv))) y d:x:(realLorentzTensor d).Tensor ![Color.up]y:(realLorentzTensor d).Tensor ![Color.up](Equiv.piCongrLeft' (fun a => ) indexEquiv) (Finsupp.equivFunOnFinite ((Tensor.basis ![Color.up]).repr x + (Tensor.basis ![Color.up]).repr y)) = (Equiv.piCongrLeft' (fun a => ) indexEquiv) (Finsupp.equivFunOnFinite ((Tensor.basis ![Color.up]).repr x)) + (Equiv.piCongrLeft' (fun a => ) indexEquiv) (Finsupp.equivFunOnFinite ((Tensor.basis ![Color.up]).repr y)) All goals completed! 🐙 map_smul := fun c x => d:c:x:(realLorentzTensor d).Tensor ![Color.up]((Tensor.basis ![Color.up]).repr.toEquiv.trans (Finsupp.equivFunOnFinite.trans (Equiv.piCongrLeft' (fun a => ) indexEquiv))) (c x) = c ((Tensor.basis ![Color.up]).repr.toEquiv.trans (Finsupp.equivFunOnFinite.trans (Equiv.piCongrLeft' (fun a => ) indexEquiv))) x d:c:x:(realLorentzTensor d).Tensor ![Color.up](Equiv.piCongrLeft' (fun a => ) indexEquiv) (Finsupp.equivFunOnFinite (c (Tensor.basis ![Color.up]).repr x)) = c (Equiv.piCongrLeft' (fun a => ) indexEquiv) (Finsupp.equivFunOnFinite ((Tensor.basis ![Color.up]).repr x)) All goals completed! 🐙}lemma toTensor_symm_apply {d : } (p : ℝT[d, .up]) : (toTensor (self := tensorial)).symm p = (Equiv.piCongrLeft' _ indexEquiv <| Finsupp.equivFunOnFinite <| (Tensor.basis (S := (realLorentzTensor d)) _).repr p) := rfld:p:Tensor.Pure (realLorentzTensor d) ![Color.up]i:Fin 1 Fin d(Equiv.piCongrLeft' (fun a => ) indexEquiv) (Finsupp.equivFunOnFinite ((Tensor.basis ![Color.up]).repr p.toTensor)) i = ((contrBasis d).repr (p 0)) (indexEquiv.symm i 0) d:p:Tensor.Pure (realLorentzTensor d) ![Color.up]i:Fin 1 Fin d((contrBasis d).repr (p 0)) (indexEquiv.symm i 0) = ((contrBasis d).repr (p 0)) (indexEquiv.symm i 0) All goals completed! 🐙

Basis

set_option backward.isDefEq.respectTransparency false in lemma toTensor_symm_basis {d : } (μ : Fin 1 Fin d) : (toTensor (self := tensorial)).symm (Tensor.basis ![Color.up] (indexEquiv.symm μ)) = basis μ := d:μ:Fin 1 Fin dtoTensor.symm ((Tensor.basis ![Color.up]) (indexEquiv.symm μ)) = basis μ d:μ:Fin 1 Fin di:Fin 1 Fin dtoTensor.symm ((Tensor.basis ![Color.up]) (indexEquiv.symm μ)) i = basis μ i All goals completed! 🐙d:μ:Fin 1 Fin dtoTensor (toTensor.symm ((Tensor.basis ![Color.up]) (indexEquiv.symm μ))) = (Tensor.basis ![Color.up]) (indexEquiv.symm μ) All goals completed! 🐙d:μ:Fin 1 Fin di✝:Fin 1 Fin dtoTensor.symm ((Tensor.basis ![Color.up]) (indexEquiv.symm μ)) i✝ = (((Tensor.basis ![Color.up]).map toTensor.symm).reindex indexEquiv) μ i✝ All goals completed! 🐙d:(Tensor.basis ![Color.up]).map toTensor.symm = (((Tensor.basis ![Color.up]).map toTensor.symm).reindex indexEquiv).reindex indexEquiv.symm d:μ:ComponentIdx ![Color.up]i✝:Fin 1 Fin d((Tensor.basis ![Color.up]).map toTensor.symm) μ i✝ = ((((Tensor.basis ![Color.up]).map toTensor.symm).reindex indexEquiv).reindex indexEquiv.symm) μ i✝ All goals completed! 🐙lemma tensor_basis_repr_toTensor_apply {d : } (p : Vector d) (μ : ComponentIdx ![Color.up]) : (Tensor.basis ![Color.up]).repr (toTensor p) μ = p (indexEquiv μ) := d:p:Vector dμ:ComponentIdx ![Color.up]((Tensor.basis ![Color.up]).repr (toTensor p)) μ = p (indexEquiv μ) d:μ:ComponentIdx ![Color.up]p:(realLorentzTensor d).Tensor ![Color.up]((Tensor.basis ![Color.up]).repr (toTensor (toTensor.symm p))) μ = toTensor.symm p (indexEquiv μ) d:μ:ComponentIdx ![Color.up]p:(realLorentzTensor d).Tensor ![Color.up]((Tensor.basis ![Color.up]).repr p) μ = toTensor.symm p (indexEquiv μ) d:μ:ComponentIdx ![Color.up]p:(realLorentzTensor d).Tensor ![Color.up] (p : Tensor.Pure (realLorentzTensor d) ![Color.up]), ((Tensor.basis ![Color.up]).repr p.toTensor) μ = toTensor.symm p.toTensor (indexEquiv μ)d:μ:ComponentIdx ![Color.up]p:(realLorentzTensor d).Tensor ![Color.up] (r : ) (t : (realLorentzTensor d).Tensor ![Color.up]), ((Tensor.basis ![Color.up]).repr t) μ = toTensor.symm t (indexEquiv μ) ((Tensor.basis ![Color.up]).repr (r t)) μ = toTensor.symm (r t) (indexEquiv μ)d:μ:ComponentIdx ![Color.up]p:(realLorentzTensor d).Tensor ![Color.up] (t1 t2 : (realLorentzTensor d).Tensor ![Color.up]), ((Tensor.basis ![Color.up]).repr t1) μ = toTensor.symm t1 (indexEquiv μ) ((Tensor.basis ![Color.up]).repr t2) μ = toTensor.symm t2 (indexEquiv μ) ((Tensor.basis ![Color.up]).repr (t1 + t2)) μ = toTensor.symm (t1 + t2) (indexEquiv μ) d:μ:ComponentIdx ![Color.up]p:(realLorentzTensor d).Tensor ![Color.up] (p : Tensor.Pure (realLorentzTensor d) ![Color.up]), ((Tensor.basis ![Color.up]).repr p.toTensor) μ = toTensor.symm p.toTensor (indexEquiv μ) d:μ:ComponentIdx ![Color.up]p✝:(realLorentzTensor d).Tensor ![Color.up]p:Tensor.Pure (realLorentzTensor d) ![Color.up]((Tensor.basis ![Color.up]).repr p.toTensor) μ = toTensor.symm p.toTensor (indexEquiv μ) d:μ:ComponentIdx ![Color.up]p✝:(realLorentzTensor d).Tensor ![Color.up]p:Tensor.Pure (realLorentzTensor d) ![Color.up]((contrBasis d).repr (p 0)) (μ 0) = ((contrBasis d).repr (p 0)) (μ 0) All goals completed! 🐙 d:μ:ComponentIdx ![Color.up]p:(realLorentzTensor d).Tensor ![Color.up] (r : ) (t : (realLorentzTensor d).Tensor ![Color.up]), ((Tensor.basis ![Color.up]).repr t) μ = toTensor.symm t (indexEquiv μ) ((Tensor.basis ![Color.up]).repr (r t)) μ = toTensor.symm (r t) (indexEquiv μ) d:μ:ComponentIdx ![Color.up]p:(realLorentzTensor d).Tensor ![Color.up]r:t:(realLorentzTensor d).Tensor ![Color.up]h:((Tensor.basis ![Color.up]).repr t) μ = toTensor.symm t (indexEquiv μ)((Tensor.basis ![Color.up]).repr (r t)) μ = toTensor.symm (r t) (indexEquiv μ) All goals completed! 🐙 d:μ:ComponentIdx ![Color.up]p:(realLorentzTensor d).Tensor ![Color.up] (t1 t2 : (realLorentzTensor d).Tensor ![Color.up]), ((Tensor.basis ![Color.up]).repr t1) μ = toTensor.symm t1 (indexEquiv μ) ((Tensor.basis ![Color.up]).repr t2) μ = toTensor.symm t2 (indexEquiv μ) ((Tensor.basis ![Color.up]).repr (t1 + t2)) μ = toTensor.symm (t1 + t2) (indexEquiv μ) d:μ:ComponentIdx ![Color.up]p:(realLorentzTensor d).Tensor ![Color.up]t1:(realLorentzTensor d).Tensor ![Color.up]t2:(realLorentzTensor d).Tensor ![Color.up]h1:((Tensor.basis ![Color.up]).repr t1) μ = toTensor.symm t1 (indexEquiv μ)h2:((Tensor.basis ![Color.up]).repr t2) μ = toTensor.symm t2 (indexEquiv μ)((Tensor.basis ![Color.up]).repr (t1 + t2)) μ = toTensor.symm (t1 + t2) (indexEquiv μ) All goals completed! 🐙

The action of the Lorentz group

d:i:Fin 1 Fin dΛ:(LorentzGroup d)p✝:(realLorentzTensor d).Tensor ![Color.up]p:Tensor.Pure (realLorentzTensor d) ![Color.up]toTensor_symm_pure_val: (q : Tensor.Pure (realLorentzTensor d) ![Color.up]) (j : Fin 1 Fin d), toTensor.symm q.toTensor j = (q 0).val j(∑ i, MulOpposite.op ((p 0).val i) (↑Λ) i) i = j, Λ i j * (p 0).val j All goals completed! 🐙 d:i:Fin 1 Fin dΛ:(LorentzGroup d)p:(realLorentzTensor d).Tensor ![Color.up] (r : ) (t : (realLorentzTensor d).Tensor ![Color.up]), toTensor.symm (Λ t) i = j, Λ i j * toTensor.symm t j toTensor.symm (Λ r t) i = j, Λ i j * toTensor.symm (r t) j d:i:Fin 1 Fin dΛ:(LorentzGroup d)p:(realLorentzTensor d).Tensor ![Color.up]r:t:(realLorentzTensor d).Tensor ![Color.up]h:toTensor.symm (Λ t) i = j, Λ i j * toTensor.symm t jtoTensor.symm (Λ r t) i = j, Λ i j * toTensor.symm (r t) j All goals completed! 🐙 d:i:Fin 1 Fin dΛ:(LorentzGroup d)p:(realLorentzTensor d).Tensor ![Color.up] (t1 t2 : (realLorentzTensor d).Tensor ![Color.up]), toTensor.symm (Λ t1) i = j, Λ i j * toTensor.symm t1 j toTensor.symm (Λ t2) i = j, Λ i j * toTensor.symm t2 j toTensor.symm (Λ (t1 + t2)) i = j, Λ i j * toTensor.symm (t1 + t2) j d:i:Fin 1 Fin dΛ:(LorentzGroup d)p:(realLorentzTensor d).Tensor ![Color.up]t1:(realLorentzTensor d).Tensor ![Color.up]t2:(realLorentzTensor d).Tensor ![Color.up]h1:toTensor.symm (Λ t1) i = j, Λ i j * toTensor.symm t1 jh2:toTensor.symm (Λ t2) i = j, Λ i j * toTensor.symm t2 jtoTensor.symm (Λ (t1 + t2)) i = j, Λ i j * toTensor.symm (t1 + t2) j All goals completed! 🐙d:Λ:(LorentzGroup d)p:Vector di:Fin 1 Fin d j, Λ i j * p j = (∑ i, MulOpposite.op (p i) (↑Λ) i) i All goals completed! 🐙lemma smul_add {d : } (Λ : LorentzGroup d) (p q : Vector d) : Λ (p + q) = Λ p + Λ q := d:Λ:(LorentzGroup d)p:Vector dq:Vector dΛ (p + q) = Λ p + Λ q All goals completed! 🐙All goals completed! 🐙All goals completed! 🐙All goals completed! 🐙lemma neg_smul {d} (Λ : LorentzGroup d) (p : Vector d) : (-Λ) p = - (Λ p) := d:Λ:(LorentzGroup d)p:Vector d-Λ p = -(Λ p) d:Λ:(LorentzGroup d)p:Vector di:Fin 1 Fin d(-Λ p) i = (-(Λ p)) i All goals completed! 🐙lemma _root_.LorentzGroup.eq_of_action_vector_eq {d : } {Λ Λ' : LorentzGroup d} (h : p : Vector d, Λ p = Λ' p) : Λ = Λ' := d:Λ:(LorentzGroup d)Λ':(LorentzGroup d)h: (p : Vector d), Λ p = Λ' pΛ = Λ' d:Λ:(LorentzGroup d)Λ':(LorentzGroup d)h: (p : Vector d), Λ p = Λ' p (x : Fin 1 Fin d ), Λ *ᵥ x = Λ' *ᵥ x All goals completed! 🐙

B. The continuous action of the Lorentz group

The Lorentz action on vectors as a continuous linear map.

def actionCLM {d : } (Λ : LorentzGroup d) : Vector d →L[] Vector d := LinearMap.toContinuousLinearMap { toFun := fun v => Λ v map_add' := smul_add Λ map_smul' := fun c v => d:Λ:(LorentzGroup d)c:v:Vector dΛ c v = (RingHom.id ) c Λ v d:Λ:(LorentzGroup d)c:v:Vector dΛ c v = c Λ v d:Λ:(LorentzGroup d)c:v:Vector di:Fin 1 Fin d(Λ c v) i = (c Λ v) i All goals completed! 🐙}
lemma actionCLM_apply {d : } (Λ : LorentzGroup d) (p : Vector d) : actionCLM Λ p = Λ p := rfllemma actionCLM_injective {d : } (Λ : LorentzGroup d) : Function.Injective (actionCLM Λ) := d:Λ:(LorentzGroup d)Function.Injective (actionCLM Λ) d:Λ:(LorentzGroup d)x1:Vector dx2:Vector d(actionCLM Λ) x1 = (actionCLM Λ) x2 x1 = x2 All goals completed! 🐙lemma actionCLM_surjective {d : } (Λ : LorentzGroup d) : Function.Surjective (actionCLM Λ) := d:Λ:(LorentzGroup d)Function.Surjective (actionCLM Λ) d:Λ:(LorentzGroup d)x1:Vector d a, (actionCLM Λ) a = x1 d:Λ:(LorentzGroup d)x1:Vector d(actionCLM Λ) ((actionCLM Λ⁻¹) x1) = x1 All goals completed! 🐙d:Λ:(LorentzGroup d)μ:Fin 1 Fin di:Fin 1 Fin d j, Λ i j * basis μ j = c, (Λ c μ basis c) i All goals completed! 🐙