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.CoVector.Basic public import Physlib.Relativity.Tensors.RealTensor.Basic public import Mathlib.Geometry.Manifold.ChartedSpace

Tensorial nature of Lorentz covectors

We define the tensorial instance on Lorentz.coVector, 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.down] Fin 1 Fin d := ComponentIdx.single (S := realLorentzTensor d) (c := Color.down)
instance tensorial {d : } : Tensorial (realLorentzTensor d) ![.down] (CoVector d) where toTensor := LinearEquiv.symm <| Equiv.toLinearEquiv ((Tensor.basis (S := (realLorentzTensor d)) ![.down]).repr.toEquiv.trans <| Finsupp.equivFunOnFinite.trans <| (Equiv.piCongrLeft' _ indexEquiv)) { map_add := fun x y => d:x:(realLorentzTensor d).Tensor ![Color.down]y:(realLorentzTensor d).Tensor ![Color.down]((Tensor.basis ![Color.down]).repr.toEquiv.trans (Finsupp.equivFunOnFinite.trans (Equiv.piCongrLeft' (fun a => ) indexEquiv))) (x + y) = ((Tensor.basis ![Color.down]).repr.toEquiv.trans (Finsupp.equivFunOnFinite.trans (Equiv.piCongrLeft' (fun a => ) indexEquiv))) x + ((Tensor.basis ![Color.down]).repr.toEquiv.trans (Finsupp.equivFunOnFinite.trans (Equiv.piCongrLeft' (fun a => ) indexEquiv))) y d:x:(realLorentzTensor d).Tensor ![Color.down]y:(realLorentzTensor d).Tensor ![Color.down](Equiv.piCongrLeft' (fun a => ) indexEquiv) (Finsupp.equivFunOnFinite ((Tensor.basis ![Color.down]).repr x + (Tensor.basis ![Color.down]).repr y)) = (Equiv.piCongrLeft' (fun a => ) indexEquiv) (Finsupp.equivFunOnFinite ((Tensor.basis ![Color.down]).repr x)) + (Equiv.piCongrLeft' (fun a => ) indexEquiv) (Finsupp.equivFunOnFinite ((Tensor.basis ![Color.down]).repr y)) All goals completed! 🐙 map_smul := fun c x => d:c:x:(realLorentzTensor d).Tensor ![Color.down]((Tensor.basis ![Color.down]).repr.toEquiv.trans (Finsupp.equivFunOnFinite.trans (Equiv.piCongrLeft' (fun a => ) indexEquiv))) (c x) = c ((Tensor.basis ![Color.down]).repr.toEquiv.trans (Finsupp.equivFunOnFinite.trans (Equiv.piCongrLeft' (fun a => ) indexEquiv))) x d:c:x:(realLorentzTensor d).Tensor ![Color.down](Equiv.piCongrLeft' (fun a => ) indexEquiv) (Finsupp.equivFunOnFinite (c (Tensor.basis ![Color.down]).repr x)) = c (Equiv.piCongrLeft' (fun a => ) indexEquiv) (Finsupp.equivFunOnFinite ((Tensor.basis ![Color.down]).repr x)) All goals completed! 🐙}lemma toTensor_symm_apply {d : } (p : ℝT[d, .down]) : (toTensor (self := tensorial)).symm p = (Equiv.piCongrLeft' _ indexEquiv <| Finsupp.equivFunOnFinite <| (Tensor.basis (S := (realLorentzTensor d)) _).repr p) := rfld:p:Tensor.Pure (realLorentzTensor d) ![Color.down]i:Fin 1 Fin d(Equiv.piCongrLeft' (fun a => ) indexEquiv) (Finsupp.equivFunOnFinite ((Tensor.basis ![Color.down]).repr p.toTensor)) i = ((coBasis d).repr (p 0)) (indexEquiv.symm i 0) d:p:Tensor.Pure (realLorentzTensor d) ![Color.down]i:Fin 1 Fin d((coBasis d).repr (p 0)) (indexEquiv.symm i 0) = ((coBasis 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.down] (indexEquiv.symm μ)) = basis μ := d:μ:Fin 1 Fin dtoTensor.symm ((Tensor.basis ![Color.down]) (indexEquiv.symm μ)) = basis μ d:μ:Fin 1 Fin di:Fin 1 Fin dtoTensor.symm ((Tensor.basis ![Color.down]) (indexEquiv.symm μ)) i = basis μ i All goals completed! 🐙d:μ:Fin 1 Fin dtoTensor (toTensor.symm ((Tensor.basis ![Color.down]) (indexEquiv.symm μ))) = (Tensor.basis ![Color.down]) (indexEquiv.symm μ) All goals completed! 🐙d:μ:Fin 1 Fin di✝:Fin 1 Fin dtoTensor.symm ((Tensor.basis ![Color.down]) (indexEquiv.symm μ)) i✝ = (((Tensor.basis ![Color.down]).map toTensor.symm).reindex indexEquiv) μ i✝ All goals completed! 🐙d:(Tensor.basis ![Color.down]).map toTensor.symm = (((Tensor.basis ![Color.down]).map toTensor.symm).reindex indexEquiv).reindex indexEquiv.symm d:μ:ComponentIdx ![Color.down]i✝:Fin 1 Fin d((Tensor.basis ![Color.down]).map toTensor.symm) μ i✝ = ((((Tensor.basis ![Color.down]).map toTensor.symm).reindex indexEquiv).reindex indexEquiv.symm) μ i✝ All goals completed! 🐙lemma tensor_basis_repr_toTensor_apply {d : } (p : CoVector d) (μ : ComponentIdx ![Color.down]) : (Tensor.basis ![Color.down]).repr (toTensor p) μ = p (indexEquiv μ) := d:p:CoVector dμ:ComponentIdx ![Color.down]((Tensor.basis ![Color.down]).repr (toTensor p)) μ = p (indexEquiv μ) d:μ:ComponentIdx ![Color.down]p:(realLorentzTensor d).Tensor ![Color.down]((Tensor.basis ![Color.down]).repr (toTensor (toTensor.symm p))) μ = toTensor.symm p (indexEquiv μ) d:μ:ComponentIdx ![Color.down]p:(realLorentzTensor d).Tensor ![Color.down]((Tensor.basis ![Color.down]).repr p) μ = toTensor.symm p (indexEquiv μ) d:μ:ComponentIdx ![Color.down]p:(realLorentzTensor d).Tensor ![Color.down] (p : Tensor.Pure (realLorentzTensor d) ![Color.down]), ((Tensor.basis ![Color.down]).repr p.toTensor) μ = toTensor.symm p.toTensor (indexEquiv μ)d:μ:ComponentIdx ![Color.down]p:(realLorentzTensor d).Tensor ![Color.down] (r : ) (t : (realLorentzTensor d).Tensor ![Color.down]), ((Tensor.basis ![Color.down]).repr t) μ = toTensor.symm t (indexEquiv μ) ((Tensor.basis ![Color.down]).repr (r t)) μ = toTensor.symm (r t) (indexEquiv μ)d:μ:ComponentIdx ![Color.down]p:(realLorentzTensor d).Tensor ![Color.down] (t1 t2 : (realLorentzTensor d).Tensor ![Color.down]), ((Tensor.basis ![Color.down]).repr t1) μ = toTensor.symm t1 (indexEquiv μ) ((Tensor.basis ![Color.down]).repr t2) μ = toTensor.symm t2 (indexEquiv μ) ((Tensor.basis ![Color.down]).repr (t1 + t2)) μ = toTensor.symm (t1 + t2) (indexEquiv μ) d:μ:ComponentIdx ![Color.down]p:(realLorentzTensor d).Tensor ![Color.down] (p : Tensor.Pure (realLorentzTensor d) ![Color.down]), ((Tensor.basis ![Color.down]).repr p.toTensor) μ = toTensor.symm p.toTensor (indexEquiv μ) d:μ:ComponentIdx ![Color.down]p✝:(realLorentzTensor d).Tensor ![Color.down]p:Tensor.Pure (realLorentzTensor d) ![Color.down]((Tensor.basis ![Color.down]).repr p.toTensor) μ = toTensor.symm p.toTensor (indexEquiv μ) d:μ:ComponentIdx ![Color.down]p✝:(realLorentzTensor d).Tensor ![Color.down]p:Tensor.Pure (realLorentzTensor d) ![Color.down]((coBasis d).repr (p 0)) (μ 0) = ((coBasis d).repr (p 0)) (μ 0) All goals completed! 🐙 d:μ:ComponentIdx ![Color.down]p:(realLorentzTensor d).Tensor ![Color.down] (r : ) (t : (realLorentzTensor d).Tensor ![Color.down]), ((Tensor.basis ![Color.down]).repr t) μ = toTensor.symm t (indexEquiv μ) ((Tensor.basis ![Color.down]).repr (r t)) μ = toTensor.symm (r t) (indexEquiv μ) d:μ:ComponentIdx ![Color.down]p:(realLorentzTensor d).Tensor ![Color.down]r:t:(realLorentzTensor d).Tensor ![Color.down]h:((Tensor.basis ![Color.down]).repr t) μ = toTensor.symm t (indexEquiv μ)((Tensor.basis ![Color.down]).repr (r t)) μ = toTensor.symm (r t) (indexEquiv μ) All goals completed! 🐙 d:μ:ComponentIdx ![Color.down]p:(realLorentzTensor d).Tensor ![Color.down] (t1 t2 : (realLorentzTensor d).Tensor ![Color.down]), ((Tensor.basis ![Color.down]).repr t1) μ = toTensor.symm t1 (indexEquiv μ) ((Tensor.basis ![Color.down]).repr t2) μ = toTensor.symm t2 (indexEquiv μ) ((Tensor.basis ![Color.down]).repr (t1 + t2)) μ = toTensor.symm (t1 + t2) (indexEquiv μ) d:μ:ComponentIdx ![Color.down]p:(realLorentzTensor d).Tensor ![Color.down]t1:(realLorentzTensor d).Tensor ![Color.down]t2:(realLorentzTensor d).Tensor ![Color.down]h1:((Tensor.basis ![Color.down]).repr t1) μ = toTensor.symm t1 (indexEquiv μ)h2:((Tensor.basis ![Color.down]).repr t2) μ = toTensor.symm t2 (indexEquiv μ)((Tensor.basis ![Color.down]).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.down]p:Tensor.Pure (realLorentzTensor d) ![Color.down](∑ i, MulOpposite.op ((p 0).val i) (↑(LorentzGroup.transpose Λ⁻¹)) i) i = j, Λ⁻¹ j i * toTensor.symm p.toTensor j d:i:Fin 1 Fin dΛ:(LorentzGroup d)p✝:(realLorentzTensor d).Tensor ![Color.down]p:Tensor.Pure (realLorentzTensor d) ![Color.down] x, (LorentzGroup.transpose Λ⁻¹) i x * (p 0).val x = x, Λ⁻¹ x i * (p 0).val (indexEquiv.symm x 0) All goals completed! 🐙 d:i:Fin 1 Fin dΛ:(LorentzGroup d)p:(realLorentzTensor d).Tensor ![Color.down] (r : ) (t : (realLorentzTensor d).Tensor ![Color.down]), toTensor.symm (Λ t) i = j, Λ⁻¹ j i * toTensor.symm t j toTensor.symm (Λ r t) i = j, Λ⁻¹ j i * toTensor.symm (r t) j d:i:Fin 1 Fin dΛ:(LorentzGroup d)p:(realLorentzTensor d).Tensor ![Color.down]r:t:(realLorentzTensor d).Tensor ![Color.down]h:toTensor.symm (Λ t) i = j, Λ⁻¹ j i * toTensor.symm t jtoTensor.symm (Λ r t) i = j, Λ⁻¹ j i * toTensor.symm (r t) j All goals completed! 🐙 d:i:Fin 1 Fin dΛ:(LorentzGroup d)p:(realLorentzTensor d).Tensor ![Color.down] (t1 t2 : (realLorentzTensor d).Tensor ![Color.down]), toTensor.symm (Λ t1) i = j, Λ⁻¹ j i * toTensor.symm t1 j toTensor.symm (Λ t2) i = j, Λ⁻¹ j i * toTensor.symm t2 j toTensor.symm (Λ (t1 + t2)) i = j, Λ⁻¹ j i * toTensor.symm (t1 + t2) j d:i:Fin 1 Fin dΛ:(LorentzGroup d)p:(realLorentzTensor d).Tensor ![Color.down]t1:(realLorentzTensor d).Tensor ![Color.down]t2:(realLorentzTensor d).Tensor ![Color.down]h1:toTensor.symm (Λ t1) i = j, Λ⁻¹ j i * toTensor.symm t1 jh2:toTensor.symm (Λ t2) i = j, Λ⁻¹ j i * toTensor.symm t2 jtoTensor.symm (Λ (t1 + t2)) i = j, Λ⁻¹ j i * toTensor.symm (t1 + t2) j All goals completed! 🐙d:Λ:(LorentzGroup d)p:CoVector di:Fin 1 Fin d j, Λ⁻¹ j i * p j = (∑ i, MulOpposite.op (p i) (↑(LorentzGroup.transpose Λ⁻¹)) i) i d:Λ:(LorentzGroup d)p:CoVector di:Fin 1 Fin d x, p x * Λ⁻¹ x i = x, p x * (LorentzGroup.transpose Λ⁻¹) i x All goals completed! 🐙lemma smul_add {d : } (Λ : LorentzGroup d) (p q : CoVector d) : Λ (p + q) = Λ p + Λ q := d:Λ:(LorentzGroup d)p:CoVector dq:CoVector dΛ (p + q) = Λ p + Λ q All goals completed! 🐙All goals completed! 🐙All goals completed! 🐙All goals completed! 🐙

The Lorentz action on vectors as a continuous linear map.

def actionCLM {d : } (Λ : LorentzGroup d) : CoVector d →L[] CoVector d := LinearMap.toContinuousLinearMap { toFun := fun v => Λ v map_add' := smul_add Λ map_smul' := fun c v => d:Λ:(LorentzGroup d)c:v:CoVector dΛ c v = (RingHom.id ) c Λ v d:Λ:(LorentzGroup d)c:v:CoVector di:Fin 1 Fin d(Λ c v) i = ((RingHom.id ) c Λ v) i All goals completed! 🐙}
lemma actionCLM_apply {d : } (Λ : LorentzGroup d) (p : CoVector d) : actionCLM Λ p = Λ p := rfld:Λ:(LorentzGroup d)μ:Fin 1 Fin di:Fin 1 Fin d j, Λ⁻¹ j i * basis μ j = c, (Λ⁻¹ μ c basis c) i All goals completed! 🐙