refactor: Major refactor of Lorentz vecs

This commit is contained in:
jstoobysmith 2024-11-09 08:06:16 +00:00
parent 3eb5da875f
commit 5cc188146f
20 changed files with 494 additions and 1005 deletions

View file

@ -79,21 +79,16 @@ import HepLean.SpaceTime.LorentzGroup.Orthochronous
import HepLean.SpaceTime.LorentzGroup.Proper
import HepLean.SpaceTime.LorentzGroup.Restricted
import HepLean.SpaceTime.LorentzGroup.Rotations
import HepLean.SpaceTime.LorentzVector.AsSelfAdjointMatrix
import HepLean.SpaceTime.LorentzVector.Basic
import HepLean.SpaceTime.LorentzVector.Complex.Basic
import HepLean.SpaceTime.LorentzVector.Complex.Contraction
import HepLean.SpaceTime.LorentzVector.Complex.Metric
import HepLean.SpaceTime.LorentzVector.Complex.Modules
import HepLean.SpaceTime.LorentzVector.Complex.Two
import HepLean.SpaceTime.LorentzVector.Complex.Unit
import HepLean.SpaceTime.LorentzVector.LorentzAction
import HepLean.SpaceTime.LorentzVector.NormOne
import HepLean.SpaceTime.LorentzVector.Real.Basic
import HepLean.SpaceTime.LorentzVector.Real.Contraction
import HepLean.SpaceTime.LorentzVector.Real.Modules
import HepLean.SpaceTime.MinkowskiMatrix
import HepLean.SpaceTime.MinkowskiMetric
import HepLean.SpaceTime.PauliMatrices.AsTensor
import HepLean.SpaceTime.PauliMatrices.Basic
import HepLean.SpaceTime.PauliMatrices.SelfAdjoint

View file

@ -3,8 +3,9 @@ Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import HepLean.SpaceTime.MinkowskiMetric
import HepLean.SpaceTime.MinkowskiMatrix
import Mathlib.Algebra.Lie.Classical
import HepLean.SpaceTime.LorentzVector.Real.Basic
/-!
# The Lorentz Algebra
@ -84,22 +85,4 @@ lemma space_comps (Λ : lorentzAlgebra) (i j : Fin 3) :
end lorentzAlgebra
@[simps!]
instance lorentzVectorAsLieRingModule : LieRingModule lorentzAlgebra (LorentzVector 3) where
bracket Λ x := Λ.1.mulVec x
add_lie Λ1 Λ2 x := by
simp [add_mulVec]
lie_add Λ x1 x2 := by
simp only
exact mulVec_add _ _ _
leibniz_lie Λ1 Λ2 x := by
simp [mulVec_add, Bracket.bracket, sub_mulVec]
@[simps!]
instance spaceTimeAsLieModule : LieModule lorentzAlgebra (LorentzVector 3) where
smul_lie r Λ x := smul_mulVec_assoc r Λ.1 x
lie_smul r Λ x := by
simp only [Bracket.bracket]
rw [mulVec_smul]
end SpaceTime

View file

@ -35,21 +35,19 @@ variable {d : }
/-- An auxillary linear map used in the definition of a generalised boost. -/
def genBoostAux₁ (u v : FuturePointing d) : ContrMod d →ₗ[] ContrMod d where
toFun x := (2 * toField d ⟪x, u.val.val⟫ₘ) • v.1.1
toFun x := (2 * ⟪x, u.val.val⟫ₘ) • v.1.1
map_add' x y := by
simp [map_add, LinearMap.add_apply, tmul_add, add_tmul, mul_add, add_smul]
map_smul' c x := by
simp only [toField, Action.instMonoidalCategory_tensorObj_V,
simp only [ Action.instMonoidalCategory_tensorObj_V,
Action.instMonoidalCategory_tensorUnit_V, CategoryTheory.Equivalence.symm_inverse,
Action.functorCategoryEquivalence_functor, Action.FunctorCategoryEquivalence.functor_obj_obj,
smul_tmul, tmul_smul, map_smul, smul_eq_mul, RingHom.id_apply]
erw [LinearMap.id_apply]
rw [← mul_assoc, mul_comm 2 c, mul_assoc, mul_smul]
rfl
/-- An auxillary linear map used in the definition of a genearlised boost. -/
def genBoostAux₂ (u v : FuturePointing d) : ContrMod d →ₗ[] ContrMod d where
toFun x := - (toField d ⟪x, u.1.1 + v.1.1⟫ₘ / (1 + toField d ⟪u.1.1, v.1.1⟫ₘ)) • (u.1.1 + v.1.1)
toFun x := - (⟪x, u.1.1 + v.1.1⟫ₘ / (1 + ⟪u.1.1, v.1.1⟫ₘ)) • (u.1.1 + v.1.1)
map_add' x y := by
simp only
rw [← add_smul]
@ -62,7 +60,7 @@ def genBoostAux₂ (u v : FuturePointing d) : ContrMod d →ₗ[] ContrMod d
rw [map_smul]
conv =>
lhs; lhs; rhs; lhs
change (c * toField d (contrContrContract.hom (x ⊗ₜ[] (u.val.val + v.val.val))))
change (c * (contrContrContractField (x ⊗ₜ[] (u.val.val + v.val.val))))
rw [mul_div_assoc, neg_mul_eq_mul_neg, smul_smul]
rfl
@ -75,21 +73,47 @@ lemma genBoostAux₂_self (u : FuturePointing d) : genBoostAux₂ u u = - genBoo
rw [smul_smul]
congr 1
rw [u.1.2]
simp [toField]
conv => lhs; lhs; rhs; rhs; change 1
rw [show 1 + (1 : ) = (2 : ) by ring]
simp only [isUnit_iff_ne_zero, ne_eq, OfNat.ofNat_ne_zero, not_false_eq_true,
IsUnit.div_mul_cancel]
rw [← (two_smul u.val.val)]
simp only [tmul_smul, map_smul, smul_eq_mul]
rfl
/-- An generalised boost. This is a Lorentz transformation which takes the four velocity `u`
to `v`. -/
def genBoost (u v : FuturePointing d) : ContrMod d →ₗ[] ContrMod d :=
LinearMap.id + genBoostAux₁ u v + genBoostAux₂ u v
lemma genBoost_mul_one_plus_contr (u v : FuturePointing d) (x : Contr d) :
(1 + ⟪u.1.1, v.1.1⟫ₘ) • genBoost u v x =
(1 + ⟪u.1.1, v.1.1⟫ₘ) • x +
(2 * ⟪x, u.val.val⟫ₘ * (1 + ⟪u.1.1, v.1.1⟫ₘ)) • v.1.1
- (⟪x, u.1.1 + v.1.1⟫ₘ) • (u.1.1 + v.1.1) := by
simp only [genBoost, LinearMap.add_apply, LinearMap.id_apply, id_eq]
rw [smul_add, smul_add]
trans (1 + ⟪u.1.1, v.1.1⟫ₘ) • x +
(2 * ⟪x, u.val.val⟫ₘ * (1 + ⟪u.1.1, v.1.1⟫ₘ)) • v.1.1
+ (- ⟪x, u.1.1 + v.1.1⟫ₘ) • (u.1.1 + v.1.1)
· congr 1
· congr 1
rw [genBoostAux₁]
simp
rw [smul_smul]
congr 1
ring
· rw [genBoostAux₂]
simp only [Action.instMonoidalCategory_tensorObj_V, Action.instMonoidalCategory_tensorUnit_V,
CategoryTheory.Equivalence.symm_inverse, Action.functorCategoryEquivalence_functor,
Action.FunctorCategoryEquivalence.functor_obj_obj, neg_smul, LinearMap.coe_mk,
AddHom.coe_mk, smul_neg]
rw [smul_smul]
congr
have h1 := FuturePointing.one_add_metric_non_zero u v
field_simp
· rw [neg_smul]
rfl
namespace genBoost
/--
@ -110,7 +134,7 @@ lemma toMatrix_mulVec (u v : FuturePointing d) (x : Contr d) :
(toMatrix u v) *ᵥ x = genBoost u v x :=
ContrMod.ext (LinearMap.toMatrix_mulVec_repr ContrMod.stdBasis ContrMod.stdBasis (genBoost u v) x)
open minkowskiMatrix LorentzVector in
open minkowskiMatrix in
@[simp]
lemma toMatrix_apply (u v : FuturePointing d) (μ ν : Fin 1 ⊕ Fin d) :
(toMatrix u v) μ ν = η μ μ * (toField d ⟪ContrMod.stdBasis μ, ContrMod.stdBasis ν⟫ₘ + 2 *
@ -118,31 +142,39 @@ lemma toMatrix_apply (u v : FuturePointing d) (μ ν : Fin 1 ⊕ Fin d) :
- toField d ⟪ContrMod.stdBasis μ, u.val.val + v.val.val⟫ₘ *
toField d ⟪ContrMod.stdBasis ν, u.val.val + v.val.val⟫ₘ /
(1 + toField d ⟪u.val.val, v.val.val⟫ₘ)) := by
sorry
rw [matrix_apply_stdBasis (toMatrix u v) μ ν, toMatrix_mulVec]
rw [contrContrContractField.matrix_apply_stdBasis (Λ := toMatrix u v) μ ν, toMatrix_mulVec]
simp only [genBoost, genBoostAux₁, genBoostAux₂, map_add, smul_add, neg_smul, LinearMap.add_apply,
LinearMap.id_apply, LinearMap.coe_mk, AddHom.coe_mk, basis_left, map_smul, smul_eq_mul, map_neg,
mul_eq_mul_left_iff]
LinearMap.id_apply, LinearMap.coe_mk, AddHom.coe_mk, contrContrContractField.basis_left, map_smul, smul_eq_mul, map_neg,
mul_eq_mul_left_iff, toField_apply]
ring_nf
exact (true_or (η μ μ = 0)).mpr trivial
simp only [Pi.add_apply, Action.instMonoidalCategory_tensorObj_V,
Action.instMonoidalCategory_tensorUnit_V, CategoryTheory.Equivalence.symm_inverse,
Action.functorCategoryEquivalence_functor, Action.FunctorCategoryEquivalence.functor_obj_obj,
Pi.smul_apply, smul_eq_mul, Pi.sub_apply, Pi.neg_apply]
apply Or.inl
ring
open minkowskiMatrix LorentzVector in
open minkowskiMatrix in
lemma toMatrix_continuous (u : FuturePointing d) : Continuous (toMatrix u) := by
refine continuous_matrix ?_
intro i j
simp only [toMatrix_apply]
refine (continuous_mul_left (η i i)).comp' ?_
refine Continuous.sub ?_ ?_
· refine .comp' (continuous_add_left (minkowskiMetric (e i) (e j))) ?_
refine .comp' (continuous_mul_left (2 * ⟪e j, u⟫ₘ)) ?_
· refine .comp' (continuous_add_left _) ?_
refine .comp' (continuous_mul_left _) ?_
exact FuturePointing.metric_continuous _
refine .mul ?_ ?_
· refine .mul ?_ ?_
· simp only [(minkowskiMetric _).map_add]
· simp only [Action.instMonoidalCategory_tensorObj_V, Action.instMonoidalCategory_tensorUnit_V,
CategoryTheory.Equivalence.symm_inverse, Action.functorCategoryEquivalence_functor,
Action.FunctorCategoryEquivalence.functor_obj_obj, tmul_add, map_add]
refine .comp' ?_ ?_
· exact continuous_add_left ((minkowskiMetric (stdBasis i)) ↑u)
· exact continuous_add_left _
· exact FuturePointing.metric_continuous _
· simp only [(minkowskiMetric _).map_add]
· simp only [Action.instMonoidalCategory_tensorObj_V, Action.instMonoidalCategory_tensorUnit_V,
CategoryTheory.Equivalence.symm_inverse, Action.functorCategoryEquivalence_functor,
Action.FunctorCategoryEquivalence.functor_obj_obj, tmul_add, map_add]
refine .comp' ?_ ?_
· exact continuous_add_left _
· exact FuturePointing.metric_continuous _
@ -150,17 +182,28 @@ lemma toMatrix_continuous (u : FuturePointing d) : Continuous (toMatrix u) := by
· refine .comp' (continuous_add_left 1) (FuturePointing.metric_continuous _)
exact fun x => FuturePointing.one_add_metric_non_zero u x
lemma toMatrix_in_lorentzGroup (u v : FuturePointing d) : (toMatrix u v) ∈ LorentzGroup d:= by
lemma toMatrix_in_lorentzGroup (u v : FuturePointing d) : (toMatrix u v) ∈ LorentzGroup d := by
rw [LorentzGroup.mem_iff_invariant]
intro x y
rw [toMatrix_mulVec, toMatrix_mulVec, genBoost, genBoostAux₁, genBoostAux₂]
have h1 : (1 + (minkowskiMetric ↑u) ↑v.1.1) ≠ 0 := FuturePointing.one_add_metric_non_zero u v
simp only [map_add, smul_add, neg_smul, LinearMap.add_apply, LinearMap.id_coe,
id_eq, LinearMap.coe_mk, AddHom.coe_mk, LinearMapClass.map_smul, map_neg, LinearMap.smul_apply,
smul_eq_mul, LinearMap.neg_apply]
field_simp
rw [u.1.2, v.1.2, minkowskiMetric.symm v.1.1 u, minkowskiMetric.symm u y,
minkowskiMetric.symm v y]
ring
rw [toMatrix_mulVec, toMatrix_mulVec]
have h1 : (((1 + ⟪u.1.1, v.1.1⟫ₘ)) * (1 + ⟪u.1.1, v.1.1⟫ₘ)) •
(contrContrContractField ((genBoost u v) y ⊗ₜ[] (genBoost u v) x))
= (((1 + ⟪u.1.1, v.1.1⟫ₘ)) * (1 + ⟪u.1.1, v.1.1⟫ₘ)) • ⟪y, x⟫ₘ := by
conv_lhs =>
erw [← map_smul]
rw [← smul_smul]
rw [← tmul_smul, ← smul_tmul, ← tmul_smul, genBoost_mul_one_plus_contr,
genBoost_mul_one_plus_contr]
simp only [add_smul, one_smul, tmul_add, map_add, smul_add, tmul_sub, sub_tmul, add_tmul,
smul_tmul, tmul_smul, map_sub, map_smul, smul_eq_mul, contr_self, mul_one]
rw [contrContrContractField.symm v.1.1 u, contrContrContractField.symm v.1.1 x,
contrContrContractField.symm u.1.1 x]
simp
ring
have hn (a : ) {b c : } (h : a ≠ 0) (hab : a * b = a * c ) : b = c := by
simp_all only [smul_eq_mul, ne_eq, mul_eq_mul_left_iff, or_false]
refine hn _ ?_ h1
simpa using (FuturePointing.one_add_metric_non_zero u v)
/-- A generalised boost as an element of the Lorentz Group. -/
def toLorentz (u v : FuturePointing d) : LorentzGroup d :=

View file

@ -24,7 +24,6 @@ namespace LorentzGroup
variable {d : }
variable (Λ : LorentzGroup d)
open LorentzVector
open Lorentz.Contr
/-- A Lorentz transformation is `orthochronous` if its `0 0` element is non-negative. -/

View file

@ -25,8 +25,6 @@ open ComplexConjugate
namespace LorentzGroup
open minkowskiMetric
informal_definition Restricted where
math :≈ "The subgroup of the Lorentz group consisting of elements which
are proper and orthochronous."

View file

@ -1,107 +0,0 @@
/-
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import HepLean.SpaceTime.MinkowskiMetric
import HepLean.SpaceTime.PauliMatrices.SelfAdjoint
import Mathlib.LinearAlgebra.Matrix.SpecialLinearGroup
import Mathlib.Tactic.Polyrith
/-!
# Lorentz vector as a self-adjoint matrix
There is a linear equivalence between the vector space of space-time points
and the vector space of 2×2-complex self-adjoint matrices.
In this file we define this linear equivalence in `toSelfAdjointMatrix`.
-/
/-! TODO: Generalize rep of Lorentz vector as a self-adjoint matrix to arbitrary dimension. -/
namespace SpaceTime
open Matrix
open MatrixGroups
open Complex
noncomputable section
/-- The linear equivalence between the vector-space `spaceTime` and self-adjoint
`2×2`-complex matrices. -/
def toSelfAdjointMatrix : LorentzVector 3 ≃ₗ[] selfAdjoint (Matrix (Fin 2) (Fin 2) ) :=
(Finsupp.linearEquivFunOnFinite (Fin 1 ⊕ Fin 3)).symm ≪≫ₗ PauliMatrix.σSAL.repr.symm
lemma toSelfAdjointMatrix_apply (x : LorentzVector 3) : toSelfAdjointMatrix x =
x (Sum.inl 0) • ⟨PauliMatrix.σ0, PauliMatrix.σ0_selfAdjoint⟩
- x (Sum.inr 0) • ⟨PauliMatrix.σ1, PauliMatrix.σ1_selfAdjoint⟩
- x (Sum.inr 1) • ⟨PauliMatrix.σ2, PauliMatrix.σ2_selfAdjoint⟩
- x (Sum.inr 2) • ⟨PauliMatrix.σ3, PauliMatrix.σ3_selfAdjoint⟩ := by
simp only [toSelfAdjointMatrix, PauliMatrix.σSAL, LinearEquiv.trans_apply, Basis.repr_symm_apply,
Basis.coe_mk, Fin.isValue]
rw [Finsupp.linearCombination_apply_of_mem_supported (s := Finset.univ)]
· change (∑ i : Fin 1 ⊕ Fin 3, x i • PauliMatrix.σSAL' i) = _
simp only [PauliMatrix.σSAL', Fintype.sum_sum_type, Finset.univ_unique, Fin.default_eq_zero,
Fin.isValue, Finset.sum_singleton, Fin.sum_univ_three]
apply Subtype.ext
simp only [Fin.isValue, AddSubgroup.coe_add, selfAdjoint.val_smul, smul_neg,
AddSubgroupClass.coe_sub]
simp only [neg_add, add_assoc, sub_eq_add_neg]
· simp_all only [Finset.coe_univ, Finsupp.supported_univ, Submodule.mem_top]
lemma toSelfAdjointMatrix_apply_coe (x : LorentzVector 3) : (toSelfAdjointMatrix x).1 =
x (Sum.inl 0) • PauliMatrix.σ0
- x (Sum.inr 0) • PauliMatrix.σ1
- x (Sum.inr 1) • PauliMatrix.σ2
- x (Sum.inr 2) • PauliMatrix.σ3 := by
rw [toSelfAdjointMatrix_apply]
rfl
lemma toSelfAdjointMatrix_stdBasis (i : Fin 1 ⊕ Fin 3) :
toSelfAdjointMatrix (LorentzVector.stdBasis i) = PauliMatrix.σSAL i := by
rw [toSelfAdjointMatrix_apply]
match i with
| Sum.inl 0 =>
simp only [LorentzVector.stdBasis, Fin.isValue]
erw [Pi.basisFun_apply]
simp [PauliMatrix.σSAL, PauliMatrix.σSAL']
| Sum.inr 0 =>
simp only [LorentzVector.stdBasis, Fin.isValue]
erw [Pi.basisFun_apply]
simp only [Fin.isValue, ne_eq, reduceCtorEq, not_false_eq_true, Pi.single_eq_of_ne, zero_smul,
Pi.single_eq_same, one_smul, zero_sub, Sum.inr.injEq, one_ne_zero, sub_zero, Fin.reduceEq,
PauliMatrix.σSAL, Basis.coe_mk, PauliMatrix.σSAL']
rfl
| Sum.inr 1 =>
simp only [LorentzVector.stdBasis, Fin.isValue]
erw [Pi.basisFun_apply]
simp only [Fin.isValue, ne_eq, reduceCtorEq, not_false_eq_true, Pi.single_eq_of_ne, zero_smul,
Sum.inr.injEq, zero_ne_one, sub_self, Pi.single_eq_same, one_smul, zero_sub, Fin.reduceEq,
sub_zero, PauliMatrix.σSAL, Basis.coe_mk, PauliMatrix.σSAL']
rfl
| Sum.inr 2 =>
simp only [LorentzVector.stdBasis, Fin.isValue]
erw [Pi.basisFun_apply]
simp only [Fin.isValue, ne_eq, reduceCtorEq, not_false_eq_true, Pi.single_eq_of_ne, zero_smul,
Sum.inr.injEq, Fin.reduceEq, sub_self, Pi.single_eq_same, one_smul, zero_sub,
PauliMatrix.σSAL, Basis.coe_mk, PauliMatrix.σSAL']
rfl
@[simp]
lemma toSelfAdjointMatrix_symm_basis (i : Fin 1 ⊕ Fin 3) :
toSelfAdjointMatrix.symm (PauliMatrix.σSAL i) = (LorentzVector.stdBasis i) := by
refine (LinearEquiv.symm_apply_eq toSelfAdjointMatrix).mpr ?_
rw [toSelfAdjointMatrix_stdBasis]
open minkowskiMetric in
lemma det_eq_ηLin (x : LorentzVector 3) : det (toSelfAdjointMatrix x).1 = ⟪x, x⟫ₘ := by
rw [toSelfAdjointMatrix_apply_coe]
simp only [Fin.isValue, eq_time_minus_inner_prod, LorentzVector.time, LorentzVector.space,
PiLp.inner_apply, Function.comp_apply, RCLike.inner_apply, conj_trivial, Fin.sum_univ_three,
ofReal_sub, ofReal_mul, ofReal_add]
simp only [Fin.isValue, PauliMatrix.σ0, smul_of, smul_cons, real_smul, mul_one, smul_zero,
smul_empty, PauliMatrix.σ1, of_sub_of, sub_cons, head_cons, sub_zero, tail_cons, zero_sub,
sub_self, zero_empty, PauliMatrix.σ2, smul_neg, sub_neg_eq_add, PauliMatrix.σ3, det_fin_two_of]
ring_nf
simp only [Fin.isValue, I_sq, mul_neg, mul_one]
ring
end
end SpaceTime

View file

@ -1,137 +0,0 @@
/-
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import Mathlib.Data.Complex.Exponential
import Mathlib.Analysis.InnerProductSpace.PiL2
/-!
# Lorentz vectors
(aka 4-vectors)
In this file we define a Lorentz vector (in 4d, this is more often called a 4-vector).
One of the most important example of a Lorentz vector is SpaceTime.
We will define the group action of the Lorentz group on Lorentz vectors in
`HepLean.SpaceTime.LorentzVector.LorentzAction` in such a way that `LorentzVector`
corresponds to contravariant Lorentz tensors.
-/
/- The number of space dimensions . -/
variable (d : )
/-- The type of Lorentz Vectors in `d`-space dimensions.
This is very weak definition of a Lorentz vector. -/
def LorentzVector : Type := (Fin 1 ⊕ Fin d) →
/-- An instance of an additive commutative monoid on `LorentzVector`. -/
instance : AddCommMonoid (LorentzVector d) := Pi.addCommMonoid
/-- An instance of a module on `LorentzVector`. -/
noncomputable instance : Module (LorentzVector d) := Pi.module _ _ _
instance : AddCommGroup (LorentzVector d) := Pi.addCommGroup
/-- The structure of a topological space `LorentzVector d`. -/
instance : TopologicalSpace (LorentzVector d) :=
haveI : NormedAddCommGroup (LorentzVector d) := Pi.normedAddCommGroup
UniformSpace.toTopologicalSpace
namespace LorentzVector
variable {d : } (v : LorentzVector d)
/-- The space components. -/
@[simp]
def space : EuclideanSpace (Fin d) := v ∘ Sum.inr
/-- The time component. -/
@[simp]
def time : := v (Sum.inl 0)
/-!
# The standard basis
-/
/-- The standard basis of `LorentzVector` indexed by `Fin 1 ⊕ Fin d`. -/
@[simps!]
noncomputable def stdBasis : Basis (Fin 1 ⊕ Fin d) (LorentzVector d) := Pi.basisFun _
/-- Notation for `stdBasis`. -/
scoped[LorentzVector] notation "e" => stdBasis
lemma stdBasis_apply (μ ν : Fin 1 ⊕ Fin d) : e μ ν = if μ = ν then 1 else 0 := by
erw [stdBasis, Pi.basisFun_apply, Pi.single_apply]
refine Eq.symm (ite_congr ?h₁ (congrFun rfl) (congrFun rfl))
exact Eq.propIntro (fun a => id (Eq.symm a)) fun a => id (Eq.symm a)
lemma decomp_stdBasis (v : LorentzVector d) : ∑ i, v i • e i = v := by
funext ν
rw [Finset.sum_apply]
rw [Finset.sum_eq_single_of_mem ν]
· simp only [HSMul.hSMul, SMul.smul, stdBasis]
erw [Pi.basisFun_apply]
simp only [Pi.single_eq_same, mul_one]
· exact Finset.mem_univ ν
· intros b _ hbi
simp only [HSMul.hSMul, SMul.smul, stdBasis, mul_eq_zero]
erw [Pi.basisFun_apply]
simp only [Pi.single]
apply Or.inr $ Function.update_noteq (id (Ne.symm hbi)) 1 0
@[simp]
lemma decomp_stdBasis' (v : LorentzVector d) :
v (Sum.inl 0) • e (Sum.inl 0) + ∑ a₂ : Fin d, v (Sum.inr a₂) • e (Sum.inr a₂) = v := by
trans ∑ i, v i • e i
· simp only [Fin.isValue, Fintype.sum_sum_type, Finset.univ_unique, Fin.default_eq_zero,
Finset.sum_singleton]
· exact decomp_stdBasis v
/-- The standard unit time vector. -/
noncomputable abbrev timeVec : (LorentzVector d) := e (Sum.inl 0)
lemma timeVec_space : (@timeVec d).space = 0 := by
funext i
simp only [space, Function.comp_apply, stdBasis_apply, Fin.isValue, reduceCtorEq, ↓reduceIte,
PiLp.zero_apply]
lemma timeVec_time: (@timeVec d).time = 1 := by
simp only [time, Fin.isValue, stdBasis_apply, ↓reduceIte]
/-!
# Reflection of space
-/
/-- The reflection of space as a linear map. -/
@[simps!]
def spaceReflectionLin : LorentzVector d →ₗ[] LorentzVector d where
toFun x := Sum.elim (x ∘ Sum.inl) (- x ∘ Sum.inr)
map_add' x y := by
funext i
rcases i with i | i
· rfl
· simp only [Sum.elim_inr, Pi.neg_apply]
apply neg_add
map_smul' c x := by
funext i
rcases i with i | i
· rfl
· simp [HSMul.hSMul, SMul.smul]
/-- The reflection of space. -/
@[simp]
def spaceReflection : LorentzVector d := spaceReflectionLin v
lemma spaceReflection_space : v.spaceReflection.space = - v.space := rfl
lemma spaceReflection_time : v.spaceReflection.time = v.time := rfl
end LorentzVector

View file

@ -94,57 +94,62 @@ def complexCoBasisFin4 : Basis (Fin 4) complexCo :=
/-- The semilinear map including real Lorentz vectors into complex contravariant
lorentz vectors. -/
def inclCongrRealLorentz : LorentzVector 3 →ₛₗ[Complex.ofRealHom] complexContr where
toFun v := {val := ofReal ∘ v}
def inclCongrRealLorentz : ContrMod 3 →ₛₗ[Complex.ofRealHom] complexContr where
toFun v := {val := ofReal ∘ v.toFin1d}
map_add' x y := by
apply Lorentz.ContrModule.ext
rw [Lorentz.ContrModule.val_add]
funext i
simp only [Function.comp_apply, ofRealHom_eq_coe, Pi.add_apply]
change ofReal (x i + y i) = _
simp only [Function.comp_apply, ofRealHom_eq_coe, Pi.add_apply, map_add]
simp only [ofRealHom_eq_coe, ofReal_add]
map_smul' c x := by
apply Lorentz.ContrModule.ext
rw [Lorentz.ContrModule.val_smul]
funext i
simp only [Function.comp_apply, ofRealHom_eq_coe, Pi.smul_apply]
change ofReal (c • x i) = _
simp only [Function.comp_apply, ofRealHom_eq_coe, Pi.smul_apply, _root_.map_smul]
simp only [smul_eq_mul, ofRealHom_eq_coe, ofReal_mul]
lemma inclCongrRealLorentz_val (v : LorentzVector 3) :
(inclCongrRealLorentz v).val = ofRealHom ∘ v := rfl
lemma inclCongrRealLorentz_val (v : ContrMod 3) :
(inclCongrRealLorentz v).val = ofRealHom ∘ v.toFin1d := rfl
lemma complexContrBasis_of_real (i : Fin 1 ⊕ Fin 3) :
(complexContrBasis i) = inclCongrRealLorentz (LorentzVector.stdBasis i) := by
(complexContrBasis i) = inclCongrRealLorentz (ContrMod.stdBasis i) := by
apply Lorentz.ContrModule.ext
simp only [complexContrBasis, Basis.coe_ofEquivFun, inclCongrRealLorentz, LorentzVector.stdBasis,
simp only [complexContrBasis, Basis.coe_ofEquivFun, inclCongrRealLorentz,
LinearMap.coe_mk, AddHom.coe_mk]
ext j
simp only [Function.comp_apply, ofRealHom_eq_coe]
erw [Pi.basisFun_apply]
simp
change (Pi.single i 1) j = _
exact Eq.symm (Pi.apply_single (fun _ => ofRealHom) (congrFun rfl) i 1 j)
by_cases h : i = j
· subst h
rw [ContrMod.toFin1d, ContrMod.stdBasis_toFin1dEquiv_apply_same]
simp
· rw [ContrMod.toFin1d, ContrMod.stdBasis_toFin1dEquiv_apply_ne h]
simp [h]
lemma inclCongrRealLorentz_ρ (M : SL(2, )) (v : LorentzVector 3) :
lemma inclCongrRealLorentz_ρ (M : SL(2, )) (v : ContrMod 3) :
(complexContr.ρ M) (inclCongrRealLorentz v) =
inclCongrRealLorentz (SL2C.repLorentzVector M v) := by
inclCongrRealLorentz ((Contr 3).ρ (SL2C.toLorentzGroup M) v) := by
apply Lorentz.ContrModule.ext
rw [complexContrBasis_ρ_val, inclCongrRealLorentz_val, inclCongrRealLorentz_val]
rw [LorentzGroup.toComplex_mulVec_ofReal]
apply congrArg
simp only [SL2C.toLorentzGroup_apply_coe]
rw [SL2C.repLorentzVector_apply_eq_mulVec]
rfl
change _ = ContrMod.toFin1d ((SL2C.toLorentzGroup M) *ᵥ v)
simp only [SL2C.toLorentzGroup_apply_coe, ContrMod.mulVec_toFin1d]
/-! TODO: Rename.-/
lemma SL2CRep_ρ_basis (M : SL(2, )) (i : Fin 1 ⊕ Fin 3) :
(complexContr.ρ M) (complexContrBasis i) =
∑ j, (SL2C.toLorentzGroup M).1 j i •
complexContrBasis j := by
rw [complexContrBasis_of_real, inclCongrRealLorentz_ρ, SL2C.repLorentzVector_stdBasis, map_sum]
rw [complexContrBasis_of_real, inclCongrRealLorentz_ρ]
rw [Contr.ρ_stdBasis, map_sum]
apply congrArg
funext j
simp only [LinearMap.map_smulₛₗ, ofRealHom_eq_coe, coe_smul]
rw [complexContrBasis_of_real]
/-! TODO: Include relation to real Lorentz vectors.-/
end Lorentz
end

View file

@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import HepLean.SpaceTime.LorentzVector.Complex.Two
import HepLean.SpaceTime.MinkowskiMetric
import HepLean.SpaceTime.MinkowskiMatrix
import HepLean.SpaceTime.LorentzVector.Complex.Contraction
import HepLean.SpaceTime.LorentzVector.Complex.Unit
/-!

View file

@ -1,41 +0,0 @@
/-
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import HepLean.SpaceTime.LorentzVector.Basic
import HepLean.SpaceTime.LorentzGroup.Basic
import Mathlib.RepresentationTheory.Basic
/-!
# Lorentz group action on Lorentz vectors.
-/
noncomputable section
namespace LorentzVector
variable {d : } (v : LorentzVector d)
/-- The contravariant action of the Lorentz group on a Lorentz vector. -/
def rep : Representation (LorentzGroup d) (LorentzVector d) where
toFun g := Matrix.toLinAlgEquiv e g
map_one' := (MulEquivClass.map_eq_one_iff (Matrix.toLinAlgEquiv e)).mpr rfl
map_mul' x y := by
simp only [lorentzGroupIsGroup_mul_coe, map_mul]
open Matrix in
lemma rep_apply (g : LorentzGroup d) : rep g v = g *ᵥ v := rfl
lemma rep_apply_stdBasis (g : LorentzGroup d) (μ : Fin 1 ⊕ Fin d) :
rep g (stdBasis μ) = ∑ ν, g.1.transpose μ ν • stdBasis ν := by
simp only [rep_apply, Fintype.sum_sum_type, Finset.univ_unique, Fin.default_eq_zero, Fin.isValue,
Finset.sum_singleton, decomp_stdBasis']
funext ν
simp only [stdBasis, Matrix.transpose_apply]
erw [Pi.basisFun_apply, Matrix.mulVec_single_one]
rfl
end LorentzVector
end

View file

@ -1,287 +0,0 @@
/-
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import HepLean.SpaceTime.LorentzVector.Basic
import HepLean.SpaceTime.MinkowskiMetric
/-!
# Lorentz vectors with norm one
-/
open minkowskiMetric
/-- The set of Lorentz vectors with norm 1. -/
@[simp]
def NormOneLorentzVector (d : ) : Set (LorentzVector d) :=
fun x => ⟪x, x⟫ₘ = 1
instance : TopologicalSpace (NormOneLorentzVector d) := instTopologicalSpaceSubtype
namespace NormOneLorentzVector
variable {d : }
section
variable (v w : NormOneLorentzVector d)
lemma mem_iff {x : LorentzVector d} : x ∈ NormOneLorentzVector d ↔ ⟪x, x⟫ₘ = 1 := by
rfl
/-- The negative of a `NormOneLorentzVector` as a `NormOneLorentzVector`. -/
def neg : NormOneLorentzVector d := ⟨- v, by
rw [mem_iff]
simp only [map_neg, LinearMap.neg_apply, neg_neg]
exact v.2⟩
lemma time_sq : v.1.time ^ 2 = 1 + ‖v.1.space‖ ^ 2 := by
rw [time_sq_eq_metric_add_space, v.2]
lemma abs_time_ge_one : 1 ≤ |v.1.time| := by
have h1 := leq_time_sq v.1
rw [v.2] at h1
exact (one_le_sq_iff_one_le_abs _).mp h1
lemma norm_space_le_abs_time : ‖v.1.space‖ < |v.1.time| := by
rw [(abs_norm _).symm, ← @sq_lt_sq, time_sq]
exact lt_one_add (‖(v.1).space‖ ^ 2)
lemma norm_space_leq_abs_time : ‖v.1.space‖ ≤ |v.1.time| :=
le_of_lt (norm_space_le_abs_time v)
lemma time_le_minus_one_or_ge_one : v.1.time ≤ -1 1 ≤ v.1.time :=
le_abs'.mp (abs_time_ge_one v)
lemma time_nonpos_iff : v.1.time ≤ 0 ↔ v.1.time ≤ - 1 := by
apply Iff.intro
· intro h
cases' time_le_minus_one_or_ge_one v with h1 h1
· exact h1
· linarith
· intro h
linarith
lemma time_nonneg_iff : 0 ≤ v.1.time ↔ 1 ≤ v.1.time := by
apply Iff.intro
· intro h
cases' time_le_minus_one_or_ge_one v with h1 h1
· linarith
· exact h1
· intro h
linarith
lemma time_pos_iff : 0 < v.1.time ↔ 1 ≤ v.1.time := by
refine Iff.intro (fun h => ?_) (fun h => ?_)
· exact (time_nonneg_iff v).mp (le_of_lt h)
· linarith
lemma time_abs_sub_space_norm :
0 ≤ |v.1.time| * |w.1.time| - ‖v.1.space‖ * ‖w.1.space‖ := by
apply sub_nonneg.mpr
apply mul_le_mul (norm_space_leq_abs_time v) (norm_space_leq_abs_time w) ?_ ?_
· exact norm_nonneg w.1.space
· exact abs_nonneg (v.1 _)
/-!
# Future pointing norm one Lorentz vectors
-/
/-- The future pointing Lorentz vectors with Norm one. -/
def FuturePointing (d : ) : Set (NormOneLorentzVector d) :=
fun x => 0 < x.1.time
instance : TopologicalSpace (FuturePointing d) := instTopologicalSpaceSubtype
namespace FuturePointing
section
variable (f f' : FuturePointing d)
lemma mem_iff : v ∈ FuturePointing d ↔ 0 < v.1.time := by
rfl
lemma mem_iff_time_nonneg : v ∈ FuturePointing d ↔ 0 ≤ v.1.time := by
refine Iff.intro (fun h => le_of_lt h) (fun h => ?_)
rw [time_nonneg_iff] at h
rw [mem_iff]
linarith
lemma not_mem_iff : v ∉ FuturePointing d ↔ v.1.time ≤ 0 := by
refine Iff.intro (fun h => ?_) (fun h => ?_)
· exact le_of_not_lt ((mem_iff v).mp.mt h)
· have h1 := (mem_iff v).mp.mt
simp only [LorentzVector.time, Fin.isValue, not_lt] at h1
exact h1 h
lemma not_mem_iff_neg : v ∉ FuturePointing d ↔ neg v ∈ FuturePointing d := by
rw [not_mem_iff, mem_iff_time_nonneg]
simp only [Fin.isValue, neg]
change _ ↔ 0 ≤ - v.1 _
exact Iff.symm neg_nonneg
lemma time_nonneg : 0 ≤ f.1.1.time := le_of_lt f.2
lemma abs_time : |f.1.1.time| = f.1.1.time := abs_of_nonneg (time_nonneg f)
lemma time_eq_sqrt : f.1.1.time = √(1 + ‖f.1.1.space‖ ^ 2) := by
symm
rw [Real.sqrt_eq_cases]
apply Or.inl
rw [← time_sq, sq]
exact ⟨rfl, time_nonneg f⟩
/-!
# The sign of ⟪v, w.1⟫ₘ different v and w
-/
lemma metric_nonneg : 0 ≤ ⟪f, f'.1.1⟫ₘ := by
apply le_trans (time_abs_sub_space_norm f f'.1)
rw [abs_time f, abs_time f']
exact ge_sub_norm f.1.1 f'.1.1
lemma one_add_metric_non_zero : 1 + ⟪f, f'.1.1⟫ₘ ≠ 0 := by
linarith [metric_nonneg f f']
/-!
# The sign of ⟪v, w.1.spaceReflection⟫ₘ different v and w
-/
section
variable {v w : NormOneLorentzVector d}
open InnerProductSpace
lemma metric_reflect_mem_mem (h : v ∈ FuturePointing d) (hw : w ∈ FuturePointing d) :
0 ≤ ⟪v.1, w.1.spaceReflection⟫ₘ := by
apply le_trans (time_abs_sub_space_norm v w)
rw [abs_time ⟨v, h⟩, abs_time ⟨w, hw⟩, sub_eq_add_neg, right_spaceReflection]
apply (add_le_add_iff_left _).mpr
rw [neg_le]
apply le_trans (neg_le_abs _ : _ ≤ |⟪(v.1).space, (w.1).space⟫_|) ?_
exact abs_real_inner_le_norm (v.1).space (w.1).space
lemma metric_reflect_not_mem_not_mem (h : v ∉ FuturePointing d) (hw : w ∉ FuturePointing d) :
0 ≤ ⟪v.1, w.1.spaceReflection⟫ₘ := by
have h1 := metric_reflect_mem_mem ((not_mem_iff_neg v).mp h) ((not_mem_iff_neg w).mp hw)
apply le_of_le_of_eq h1 ?_
simp [neg]
lemma metric_reflect_mem_not_mem (h : v ∈ FuturePointing d) (hw : w ∉ FuturePointing d) :
⟪v.1, w.1.spaceReflection⟫ₘ ≤ 0 := by
rw [show (0 : ) = - 0 from zero_eq_neg.mpr rfl, le_neg]
have h1 := metric_reflect_mem_mem h ((not_mem_iff_neg w).mp hw)
apply le_of_le_of_eq h1 ?_
simp [neg]
lemma metric_reflect_not_mem_mem (h : v ∉ FuturePointing d) (hw : w ∈ FuturePointing d) :
⟪v.1, w.1.spaceReflection⟫ₘ ≤ 0 := by
rw [show (0 : ) = - 0 from zero_eq_neg.mpr rfl, le_neg]
have h1 := metric_reflect_mem_mem ((not_mem_iff_neg v).mp h) hw
apply le_of_le_of_eq h1 ?_
simp [neg]
end
end
end FuturePointing
end
namespace FuturePointing
/-!
# Topology
-/
open LorentzVector
/-- The `FuturePointing d` which has all space components zero. -/
@[simps!]
noncomputable def timeVecNormOneFuture : FuturePointing d := ⟨⟨timeVec, by
rw [NormOneLorentzVector.mem_iff, on_timeVec]⟩, by
rw [mem_iff, timeVec_time]; exact Real.zero_lt_one⟩
/-- A continuous path from `timeVecNormOneFuture` to any other. -/
noncomputable def pathFromTime (u : FuturePointing d) : Path timeVecNormOneFuture u where
toFun t := ⟨
⟨fun i => match i with
| Sum.inl 0 => √(1 + t ^ 2 * ‖u.1.1.space‖ ^ 2)
| Sum.inr i => t * u.1.1.space i,
by
rw [NormOneLorentzVector.mem_iff, minkowskiMetric.eq_time_minus_inner_prod]
simp only [time, space, Function.comp_apply, PiLp.inner_apply, RCLike.inner_apply, map_mul,
conj_trivial]
rw [Real.mul_self_sqrt, ← @real_inner_self_eq_norm_sq, @PiLp.inner_apply]
· simp only [Function.comp_apply, RCLike.inner_apply, conj_trivial]
refine Eq.symm (eq_sub_of_add_eq (congrArg (HAdd.hAdd 1) ?_))
rw [Finset.mul_sum]
apply Finset.sum_congr rfl
intro i _
ring
· exact Right.add_nonneg (zero_le_one' ) $ mul_nonneg (sq_nonneg _) (sq_nonneg _)⟩,
by
simp only [space, Function.comp_apply, mem_iff_time_nonneg, time, Real.sqrt_pos]
exact Real.sqrt_nonneg _⟩
continuous_toFun := by
refine Continuous.subtype_mk ?_ _
refine Continuous.subtype_mk ?_ _
apply (continuous_pi_iff).mpr
intro i
match i with
| Sum.inl 0 =>
continuity
| Sum.inr i =>
continuity
source' := by
ext
funext i
match i with
| Sum.inl 0 =>
simp only [Set.Icc.coe_zero, ne_eq, OfNat.ofNat_ne_zero, not_false_eq_true, zero_pow, space,
zero_mul, add_zero, Real.sqrt_one, Fin.isValue, timeVecNormOneFuture_coe_coe]
exact Eq.symm timeVec_time
| Sum.inr i =>
simp only [Set.Icc.coe_zero, space, Function.comp_apply, zero_mul,
timeVecNormOneFuture_coe_coe]
change _ = timeVec.space i
rw [timeVec_space]
rfl
target' := by
ext
funext i
match i with
| Sum.inl 0 =>
simp only [Set.Icc.coe_one, one_pow, space, one_mul, Fin.isValue]
exact (time_eq_sqrt u).symm
| Sum.inr i =>
simp only [Set.Icc.coe_one, one_pow, space, one_mul, Fin.isValue]
exact rfl
lemma isPathConnected : IsPathConnected (@Set.univ (FuturePointing d)) := by
use timeVecNormOneFuture
apply And.intro trivial ?_
intro y a
use pathFromTime y
exact fun _ => a
lemma metric_continuous (u : LorentzVector d) :
Continuous (fun (a : FuturePointing d) => ⟪u, a.1.1⟫ₘ) := by
simp only [minkowskiMetric.eq_time_minus_inner_prod]
refine Continuous.add ?_ ?_
· refine Continuous.comp' (continuous_mul_left _) $ Continuous.comp'
(continuous_apply (Sum.inl 0))
(Continuous.comp' continuous_subtype_val continuous_subtype_val)
· refine Continuous.comp' continuous_neg $ Continuous.inner
(Continuous.comp' (Pi.continuous_precomp Sum.inr) continuous_const)
(Continuous.comp' (Pi.continuous_precomp Sum.inr) (Continuous.comp'
continuous_subtype_val continuous_subtype_val))
end FuturePointing
end NormOneLorentzVector

View file

@ -30,9 +30,30 @@ open minkowskiMatrix
Lorentz vectors. In index notation these have an up index `ψⁱ`. -/
def Contr (d : ) : Rep (LorentzGroup d) := Rep.of ContrMod.rep
instance : TopologicalSpace (Contr d) :=
haveI : NormedAddCommGroup (Contr d) := ContrMod.norm
UniformSpace.toTopologicalSpace
instance : TopologicalSpace (Contr d) := TopologicalSpace.induced
ContrMod.toFin1dEquiv (Pi.topologicalSpace)
instance : TopologicalSpace (ContrMod d) := TopologicalSpace.induced
ContrMod.toFin1dEquiv (Pi.topologicalSpace)
lemma toFin1dEquiv_isInducing : IsInducing (@ContrMod.toFin1dEquiv d) := by
exact { eq_induced := rfl }
lemma toFin1dEquiv_symm_isInducing : IsInducing ((@ContrMod.toFin1dEquiv d).symm) := by
let x := Equiv.toHomeomorphOfIsInducing (@ContrMod.toFin1dEquiv d).toEquiv
toFin1dEquiv_isInducing
exact Homeomorph.isInducing x.symm
lemma continuous_contr {T : Type} [TopologicalSpace T] (f : T → Contr d)
(h : Continuous (fun i => (f i).toFin1d)) : Continuous f := by
exact continuous_induced_rng.mpr h
lemma contr_continuous {T : Type} [TopologicalSpace T] (f : Contr d → T)
(h : Continuous (f ∘ (@ContrMod.toFin1dEquiv d).symm)): Continuous f := by
let x := Equiv.toHomeomorphOfIsInducing (@ContrMod.toFin1dEquiv d).toEquiv
toFin1dEquiv_isInducing
rw [← Homeomorph.comp_continuous_iff' x.symm]
exact h
/-- The representation of `LorentzGroup d` on real vectors corresponding to covariant
Lorentz vectors. In index notation these have an up index `ψⁱ`. -/
@ -42,6 +63,7 @@ open CategoryTheory.MonoidalCategory
def toField (d : ) : (𝟙_ (Rep ↑(LorentzGroup d))) →ₗ[] := LinearMap.id
lemma toField_apply {d : } (a : 𝟙_ (Rep ↑(LorentzGroup d))) : toField d a = a := rfl
/-!
## Isomorphism between contravariant and covariant Lorentz vectors
@ -108,5 +130,21 @@ def contrIsoCo (d : ) : Contr d ≅ Co d where
rw [LinearEquiv.apply_symm_apply, mulVec_mulVec, minkowskiMatrix.sq]
simp
/-!
## Other properties
-/
namespace Contr
open Lorentz
lemma ρ_stdBasis (μ : Fin 1 ⊕ Fin 3) (Λ : LorentzGroup 3) :
(Contr 3).ρ Λ (ContrMod.stdBasis μ) = ∑ j, Λ.1 j μ • ContrMod.stdBasis j := by
change Λ *ᵥ ContrMod.stdBasis μ = ∑ j, Λ.1 j μ • ContrMod.stdBasis j
apply ContrMod.ext
simp only [toLinAlgEquiv_self, Fintype.sum_sum_type, Finset.univ_unique, Fin.default_eq_zero,
Fin.isValue, Finset.sum_singleton, ContrMod.val_add, ContrMod.val_smul]
end Contr
end Lorentz
end

View file

@ -141,13 +141,18 @@ open CategoryTheory
def contrContrContract : Contr d ⊗ Contr d ⟶ 𝟙_ (Rep (LorentzGroup d)) :=
(Contr d ◁ Contr.toCo d) ≫ contrCoContract
/-- Notation for `contrContrContract` acting on a tmul. -/
scoped[Lorentz] notation "⟪" ψ "," φ "⟫ₘ" => contrContrContract.hom (ψ ⊗ₜ φ)
/-- The linear map from Contr d ⊗ Contr d to induced by the homomorphism
`Contr.toCo` and the contraction `contrCoContract`. -/
def contrContrContractField : (Contr d).V ⊗[] (Contr d).V →ₗ[] :=
contrContrContract.hom
/-- Notation for `contrContrContractField` acting on a tmul. -/
scoped[Lorentz] notation "⟪" ψ "," φ "⟫ₘ" => contrContrContractField (ψ ⊗ₜ φ)
lemma contrContrContract_hom_tmul (φ : Contr d) (ψ : Contr d) :
⟪φ, ψ⟫ₘ = φ.toFin1d ⬝ᵥ η *ᵥ ψ.toFin1d:= by
simp only [Action.instMonoidalCategory_tensorUnit_V, Action.instMonoidalCategory_tensorObj_V,
contrContrContract, Action.comp_hom, Action.instMonoidalCategory_whiskerLeft_hom,
contrContrContractField, Action.comp_hom, Action.instMonoidalCategory_whiskerLeft_hom,
Equivalence.symm_inverse, Action.functorCategoryEquivalence_functor,
Action.FunctorCategoryEquivalence.functor_obj_obj, ModuleCat.coe_comp, Function.comp_apply,
ModuleCat.MonoidalCategory.whiskerLeft_apply]
@ -176,10 +181,10 @@ lemma coCoContract_hom_tmul (φ : Co d) (ψ : Co d) :
## Lemmas related to contraction.
We derive the lemmas in main for `contrContrContract`.
We derive the lemmas in main for `contrContrContractField`.
-/
namespace contrContrContract
namespace contrContrContractField
variable (x y : Contr d)
@ -354,7 +359,7 @@ lemma _root_.LorentzGroup.mem_iff_norm : Λ ∈ LorentzGroup d ↔
-/
lemma inl_sq_eq (v : Contr d) : v.val (Sum.inl 0) ^ 2 =
(toField d ⟪v, v⟫ₘ) + ∑ i, v.val (Sum.inr i) ^ 2:= by
(⟪v, v⟫ₘ) + ∑ i, v.val (Sum.inr i) ^ 2:= by
rw [as_sum]
apply sub_eq_iff_eq_add.mp
congr
@ -362,7 +367,7 @@ lemma inl_sq_eq (v : Contr d) : v.val (Sum.inl 0) ^ 2 =
· funext i
exact pow_two (v.val (Sum.inr i))
lemma le_inl_sq (v : Contr d) : toField d ⟪v, v⟫ₘ ≤ v.val (Sum.inl 0) ^ 2 := by
lemma le_inl_sq (v : Contr d) : ⟪v, v⟫ₘ ≤ v.val (Sum.inl 0) ^ 2 := by
rw [inl_sq_eq]
apply (le_add_iff_nonneg_right _).mpr
refine Fintype.sum_nonneg ?hf
@ -380,7 +385,70 @@ lemma ge_sub_norm (v w : Contr d) : v.val (Sum.inl 0) * w.val (Sum.inl 0) -
rw [sub_le_sub_iff_left]
exact norm_inner_le_norm v.toSpace w.toSpace
end contrContrContract
/-!
# The Minkowski metric and the standard basis
-/
@[simp]
lemma basis_left {v : Contr d} (μ : Fin 1 ⊕ Fin d) :
⟪ ContrMod.stdBasis μ, v⟫ₘ = η μ μ * v.toFin1d μ := by
rw [as_sum]
rcases μ with μ | μ
· fin_cases μ
simp [minkowskiMatrix, LieAlgebra.Orthogonal.indefiniteDiagonal]
rfl
· simp only [Action.instMonoidalCategory_tensorUnit_V, Fin.isValue, ContrMod.stdBasis_apply,
reduceCtorEq, ↓reduceIte, zero_mul, Sum.inr.injEq, ite_mul, one_mul, Finset.sum_ite_eq,
Finset.mem_univ, zero_sub, minkowskiMatrix, LieAlgebra.Orthogonal.indefiniteDiagonal,
diagonal_apply_eq, Sum.elim_inr, neg_mul, neg_inj]
rfl
lemma on_basis_mulVec (μ ν : Fin 1 ⊕ Fin d) : ⟪ContrMod.stdBasis μ, Λ *ᵥ ContrMod.stdBasis ν⟫ₘ = η μ μ * Λ μ ν := by
rw [basis_left]
rw [@ContrMod.mulVec_toFin1d]
simp [basis_left, mulVec, dotProduct, ContrMod.stdBasis_apply, ContrMod.toFin1d_eq_val]
lemma on_basis (μ ν : Fin 1 ⊕ Fin d) : ⟪ContrMod.stdBasis μ, ContrMod.stdBasis ν⟫ₘ = η μ ν := by
trans ⟪ContrMod.stdBasis μ, 1 *ᵥ ContrMod.stdBasis ν⟫ₘ
· rw [ContrMod.one_mulVec]
rw [on_basis_mulVec]
by_cases h : μ = ν
· subst h
simp
· simp only [Action.instMonoidalCategory_tensorUnit_V, ne_eq, h, not_false_eq_true, one_apply_ne,
mul_zero, off_diag_zero]
lemma matrix_apply_stdBasis (ν μ : Fin 1 ⊕ Fin d) :
Λ ν μ = η ν ν * ⟪ ContrMod.stdBasis ν, Λ *ᵥ ContrMod.stdBasis μ⟫ₘ := by
rw [on_basis_mulVec, ← mul_assoc]
simp [η_apply_mul_η_apply_diag ν]
/-!
## Self-adjoint
-/
lemma same_eq_det_toSelfAdjoint (x : ContrMod 3) :
⟪x, x⟫ₘ = det (ContrMod.toSelfAdjoint x).1 := by
rw [ContrMod.toSelfAdjoint_apply_coe]
simp only [Fin.isValue, as_sum_toSpace,
PiLp.inner_apply, Function.comp_apply, RCLike.inner_apply, conj_trivial, Fin.sum_univ_three,
ofReal_sub, ofReal_mul, ofReal_add]
simp only [Fin.isValue, PauliMatrix.σ0, smul_of, smul_cons, real_smul, mul_one, smul_zero,
smul_empty, PauliMatrix.σ1, of_sub_of, sub_cons, head_cons, sub_zero, tail_cons, zero_sub,
sub_self, zero_empty, PauliMatrix.σ2, smul_neg, sub_neg_eq_add, PauliMatrix.σ3, det_fin_two_of]
ring_nf
simp only [Fin.isValue, ContrMod.toFin1d_eq_val, I_sq, mul_neg, mul_one, ContrMod.toSpace,
Function.comp_apply]
ring
end contrContrContractField
end Lorentz
end

View file

@ -7,6 +7,7 @@ import HepLean.Meta.Informal
import HepLean.SpaceTime.LorentzGroup.Basic
import Mathlib.RepresentationTheory.Rep
import Mathlib.Logic.Equiv.TransferInstance
import HepLean.SpaceTime.PauliMatrices.SelfAdjoint
/-!
## Modules associated with Real Lorentz vectors
@ -74,6 +75,7 @@ def toFin1dEquiv : ContrMod d ≃ₗ[] (Fin 1 ⊕ Fin d → ) :=
through the linear equivalence `toFin1dEquiv`. -/
abbrev toFin1d (ψ : ContrMod d) := toFin1dEquiv ψ
lemma toFin1d_eq_val (ψ : ContrMod d) : ψ.toFin1d = ψ.val := by rfl
/-!
## The standard basis.
@ -109,6 +111,13 @@ lemma stdBasis_inl_apply_inr (i : Fin d) : (stdBasis (Sum.inl 0)).val (Sum.inr i
refine stdBasis_toFin1dEquiv_apply_ne ?_
simp
lemma stdBasis_apply (μ ν : Fin 1 ⊕ Fin d) : (stdBasis μ).val ν = if μ = ν then 1 else 0 := by
simp [stdBasis, Pi.basisFun_apply, Pi.single_apply]
change Pi.single μ 1 ν = _
simp [Pi.single_apply]
refine ite_congr ?h₁ (congrFun rfl) (congrFun rfl)
exact Eq.propIntro (fun a => id (Eq.symm a)) fun a => id (Eq.symm a)
/-- Decomposition of a contrvariant Lorentz vector into the standard basis. -/
lemma stdBasis_decomp (v : ContrMod d) : v = ∑ i, v.toFin1d i • stdBasis i := by
apply toFin1dEquiv.injective
@ -192,6 +201,76 @@ lemma rep_apply_toFin1d (g : LorentzGroup d) (ψ : ContrMod d) :
(rep g ψ).toFin1d = g.1 *ᵥ ψ.toFin1d := by
rfl
/-!
## To Self-Adjoint Matrix
-/
/-- The linear equivalence between the vector-space `ContrMod 3` and self-adjoint
`2×2`-complex matrices. -/
def toSelfAdjoint : ContrMod 3 ≃ₗ[] selfAdjoint (Matrix (Fin 2) (Fin 2) ) :=
toFin1dEquiv ≪≫ₗ (Finsupp.linearEquivFunOnFinite (Fin 1 ⊕ Fin 3)).symm ≪≫ₗ
PauliMatrix.σSAL.repr.symm
lemma toSelfAdjoint_apply (x : ContrMod 3) : toSelfAdjoint x =
x.toFin1d (Sum.inl 0) • ⟨PauliMatrix.σ0, PauliMatrix.σ0_selfAdjoint⟩
- x.toFin1d (Sum.inr 0) • ⟨PauliMatrix.σ1, PauliMatrix.σ1_selfAdjoint⟩
- x.toFin1d (Sum.inr 1) • ⟨PauliMatrix.σ2, PauliMatrix.σ2_selfAdjoint⟩
- x.toFin1d (Sum.inr 2) • ⟨PauliMatrix.σ3, PauliMatrix.σ3_selfAdjoint⟩ := by
simp only [toSelfAdjoint, PauliMatrix.σSAL, LinearEquiv.trans_apply, Basis.repr_symm_apply,
Basis.coe_mk, Fin.isValue]
rw [Finsupp.linearCombination_apply_of_mem_supported (s := Finset.univ)]
· change (∑ i : Fin 1 ⊕ Fin 3, x.toFin1d i • PauliMatrix.σSAL' i) = _
simp only [PauliMatrix.σSAL', Fintype.sum_sum_type, Finset.univ_unique, Fin.default_eq_zero,
Fin.isValue, Finset.sum_singleton, Fin.sum_univ_three]
apply Subtype.ext
simp only [Fin.isValue, AddSubgroup.coe_add, selfAdjoint.val_smul, smul_neg,
AddSubgroupClass.coe_sub]
simp only [neg_add, add_assoc, sub_eq_add_neg]
· simp_all only [Finset.coe_univ, Finsupp.supported_univ, Submodule.mem_top]
lemma toSelfAdjoint_apply_coe (x : ContrMod 3) : (toSelfAdjoint x).1 =
x.toFin1d (Sum.inl 0) • PauliMatrix.σ0
- x.toFin1d (Sum.inr 0) • PauliMatrix.σ1
- x.toFin1d (Sum.inr 1) • PauliMatrix.σ2
- x.toFin1d (Sum.inr 2) • PauliMatrix.σ3 := by
rw [toSelfAdjoint_apply]
rfl
lemma toSelfAdjoint_stdBasis (i : Fin 1 ⊕ Fin 3) :
toSelfAdjoint (stdBasis i) = PauliMatrix.σSAL i := by
rw [toSelfAdjoint_apply]
match i with
| Sum.inl 0 =>
simp only [stdBasis, Fin.isValue, Basis.coe_ofEquivFun, LinearEquiv.apply_symm_apply,
Pi.single_eq_same, one_smul, ne_eq, reduceCtorEq, not_false_eq_true, Pi.single_eq_of_ne,
zero_smul, sub_zero, PauliMatrix.σSAL, Basis.coe_mk, PauliMatrix.σSAL']
| Sum.inr 0 =>
simp only [stdBasis, Fin.isValue, Basis.coe_ofEquivFun, LinearEquiv.apply_symm_apply, ne_eq,
reduceCtorEq, not_false_eq_true, Pi.single_eq_of_ne, zero_smul, Pi.single_eq_same, one_smul,
zero_sub, Sum.inr.injEq, one_ne_zero, sub_zero, Fin.reduceEq, PauliMatrix.σSAL, Basis.coe_mk,
PauliMatrix.σSAL']
rfl
| Sum.inr 1 =>
simp only [stdBasis, Fin.isValue, Basis.coe_ofEquivFun, LinearEquiv.apply_symm_apply, ne_eq,
reduceCtorEq, not_false_eq_true, Pi.single_eq_of_ne, zero_smul, Sum.inr.injEq, zero_ne_one,
sub_self, Pi.single_eq_same, one_smul, zero_sub, Fin.reduceEq, sub_zero, PauliMatrix.σSAL,
Basis.coe_mk, PauliMatrix.σSAL']
rfl
| Sum.inr 2 =>
simp only [stdBasis, Fin.isValue, Basis.coe_ofEquivFun, LinearEquiv.apply_symm_apply, ne_eq,
reduceCtorEq, not_false_eq_true, Pi.single_eq_of_ne, zero_smul, Sum.inr.injEq, Fin.reduceEq,
sub_self, Pi.single_eq_same, one_smul, zero_sub, PauliMatrix.σSAL, Basis.coe_mk,
PauliMatrix.σSAL']
rfl
@[simp]
lemma toSelfAdjoint_symm_basis (i : Fin 1 ⊕ Fin 3) :
toSelfAdjoint.symm (PauliMatrix.σSAL i) = (stdBasis i) := by
refine (LinearEquiv.symm_apply_eq toSelfAdjoint).mpr ?_
rw [toSelfAdjoint_stdBasis]
end ContrMod
/-- The module for covariant (up-index) complex Lorentz vectors. -/
@ -266,6 +345,14 @@ lemma stdBasis_toFin1dEquiv_apply_ne {μ ν : Fin 1 ⊕ Fin d} (h : μ ≠ ν
rw [@LinearEquiv.apply_symm_apply]
exact Pi.single_eq_of_ne' h 1
lemma stdBasis_apply (μ ν : Fin 1 ⊕ Fin d) : (stdBasis μ).val ν = if μ = ν then 1 else 0 := by
simp [stdBasis, Pi.basisFun_apply, Pi.single_apply]
change Pi.single μ 1 ν = _
simp [Pi.single_apply]
refine ite_congr ?h₁ (congrFun rfl) (congrFun rfl)
exact Eq.propIntro (fun a => id (Eq.symm a)) fun a => id (Eq.symm a)
/-- Decomposition of a covariant Lorentz vector into the standard basis. -/
lemma stdBasis_decomp (v : CoMod d) : v = ∑ i, v.toFin1d i • stdBasis i := by
apply toFin1dEquiv.injective

View file

@ -29,9 +29,12 @@ namespace NormOne
lemma mem_iff {v : Contr d} : v ∈ NormOne d ↔ ⟪v, v⟫ₘ = (1 : ) := by
rfl
@[simp]
lemma contr_self (v : NormOne d) : ⟪v.1, v.1⟫ₘ = (1 : ) := v.2
lemma mem_mulAction (g : LorentzGroup d) (v : Contr d) :
v ∈ NormOne d ↔ (Contr d).ρ g v ∈ NormOne d := by
rw [mem_iff, mem_iff, contrContrContract.action_tmul]
rw [mem_iff, mem_iff, contrContrContractField.action_tmul]
instance : TopologicalSpace (NormOne d) := instTopologicalSpaceSubtype
@ -49,7 +52,7 @@ def neg : NormOne d := ⟨- v, by
@[simps!]
def _root_.LorentzGroup.toNormOne (Λ : LorentzGroup d) : NormOne d :=
⟨(Contr d).ρ Λ (ContrMod.stdBasis (Sum.inl 0)), by
rw [mem_iff, contrContrContract.action_tmul, contrContrContract.stdBasis_inl]⟩
rw [mem_iff, contrContrContractField.action_tmul, contrContrContractField.stdBasis_inl]⟩
lemma _root_.LorentzGroup.toNormOne_inl (Λ : LorentzGroup d) :
(LorentzGroup.toNormOne Λ).val.val (Sum.inl 0) = Λ.1 (Sum.inl 0) (Sum.inl 0) := by
@ -64,7 +67,7 @@ lemma _root_.LorentzGroup.toNormOne_inr (Λ : LorentzGroup d) (i : Fin d) :
lemma _root_.LorentzGroup.inl_inl_mul (Λ Λ' : LorentzGroup d) : (Λ * Λ').1 (Sum.inl 0) (Sum.inl 0) =
⟪(LorentzGroup.toNormOne (LorentzGroup.transpose Λ)).1,
(Contr d).ρ LorentzGroup.parity (LorentzGroup.toNormOne Λ').1⟫ₘ := by
rw [contrContrContract.right_parity]
rw [contrContrContractField.right_parity]
simp only [Fin.isValue, lorentzGroupIsGroup_mul_coe, Matrix.mul_apply, Fintype.sum_sum_type,
Finset.univ_unique, Fin.default_eq_zero, Finset.sum_singleton,
LorentzGroup.transpose, PiLp.inner_apply, Function.comp_apply,
@ -78,7 +81,7 @@ lemma _root_.LorentzGroup.inl_inl_mul (Λ Λ' : LorentzGroup d) : (Λ * Λ').1 (
rfl
lemma inl_sq : v.val.val (Sum.inl 0) ^ 2 = 1 + ‖ContrMod.toSpace v.val‖ ^ 2 := by
rw [contrContrContract.inl_sq_eq, v.2]
rw [contrContrContractField.inl_sq_eq, v.2]
congr
rw [← real_inner_self_eq_norm_sq]
simp only [PiLp.inner_apply, RCLike.inner_apply, conj_trivial]
@ -87,7 +90,7 @@ lemma inl_sq : v.val.val (Sum.inl 0) ^ 2 = 1 + ‖ContrMod.toSpace v.val‖ ^ 2
exact pow_two ((v.val).val (Sum.inr x))
lemma one_le_abs_inl : 1 ≤ |v.val.val (Sum.inl 0)| := by
have h1 := contrContrContract.le_inl_sq v.val
have h1 := contrContrContractField.le_inl_sq v.val
rw [v.2] at h1
exact (one_le_sq_iff_one_le_abs _).mp h1
@ -175,34 +178,44 @@ lemma inl_nonneg : 0 ≤ f.val.val.val (Sum.inl 0):= le_of_lt f.2
lemma abs_inl : |f.val.val.val (Sum.inl 0)| = f.val.val.val (Sum.inl 0) :=
abs_of_nonneg (inl_nonneg f)
lemma inl_eq_sqrt : f.val.val.val (Sum.inl 0) = √(1 + ‖f.1.1.toSpace‖ ^ 2) := by
symm
rw [Real.sqrt_eq_cases]
apply Or.inl
rw [← inl_sq, sq]
exact ⟨rfl, inl_nonneg f⟩
open InnerProductSpace
lemma metric_nonneg : 0 ≤ toField d ⟪f.1.1, f'.1.1⟫ₘ := by
lemma metric_nonneg : 0 ≤ ⟪f.1.1, f'.1.1⟫ₘ := by
apply le_trans (inl_abs_sub_space_norm f f'.1)
rw [abs_inl f, abs_inl f']
exact contrContrContract.ge_sub_norm f.1.1 f'.1.1
exact contrContrContractField.ge_sub_norm f.1.1 f'.1.1
lemma one_add_metric_non_zero : 1 + ⟪f.1.1, f'.1.1⟫ₘ ≠ 0 := by
linarith [metric_nonneg f f']
variable {v w : NormOne d}
lemma metric_reflect_mem_mem (h : v ∈ FuturePointing d) (hw : w ∈ FuturePointing d) :
0 ≤ toField d ⟪v.val, (Contr d).ρ LorentzGroup.parity w.1⟫ₘ :=
0 ≤ ⟪v.val, (Contr d).ρ LorentzGroup.parity w.1⟫ₘ :=
metric_nonneg ⟨v, h⟩ ⟨⟨(Contr d).ρ LorentzGroup.parity w.1,
(NormOne.mem_mulAction _ _).mp w.2⟩, (mem_iff_parity_mem w).mp hw⟩
lemma metric_reflect_not_mem_not_mem (h : v ∉ FuturePointing d) (hw : w ∉ FuturePointing d) :
0 ≤ toField d ⟪v.val, (Contr d).ρ LorentzGroup.parity w.1⟫ₘ := by
0 ≤ ⟪v.val, (Contr d).ρ LorentzGroup.parity w.1⟫ₘ := by
have h1 := metric_reflect_mem_mem ((not_mem_iff_neg v).mp h) ((not_mem_iff_neg w).mp hw)
apply le_of_le_of_eq h1 ?_
simp [neg, neg_tmul, tmul_neg]
lemma metric_reflect_mem_not_mem (h : v ∈ FuturePointing d) (hw : w ∉ FuturePointing d) :
toField d ⟪v.val, (Contr d).ρ LorentzGroup.parity w.1⟫ₘ ≤ 0 := by
⟪v.val, (Contr d).ρ LorentzGroup.parity w.1⟫ₘ ≤ 0 := by
rw [show (0 : ) = - 0 from zero_eq_neg.mpr rfl, le_neg]
have h1 := metric_reflect_mem_mem h ((not_mem_iff_neg w).mp hw)
apply le_of_le_of_eq h1 ?_
simp [neg, neg_tmul, tmul_neg]
lemma metric_reflect_not_mem_mem (h : v ∉ FuturePointing d) (hw : w ∈ FuturePointing d) :
toField d ⟪v.val, (Contr d).ρ LorentzGroup.parity w.1⟫ₘ ≤ 0 := by
⟪v.val, (Contr d).ρ LorentzGroup.parity w.1⟫ₘ ≤ 0 := by
rw [show (0 : ) = - 0 from zero_eq_neg.mpr rfl, le_neg]
have h1 := metric_reflect_mem_mem ((not_mem_iff_neg v).mp h) hw
apply le_of_le_of_eq h1 ?_
@ -212,6 +225,106 @@ end FuturePointing
end NormOne
namespace NormOne
namespace FuturePointing
/-!
## Topology
-/
/-- The `FuturePointing d` which has all space components zero. -/
@[simps!]
noncomputable def timeVecNormOneFuture : FuturePointing d := ⟨⟨ContrMod.stdBasis (Sum.inl 0), by
rw [NormOne.mem_iff, contrContrContractField.on_basis]
rfl⟩, by
rw [mem_iff]
simp⟩
/-- A continuous path from `timeVecNormOneFuture` to any other. -/
noncomputable def pathFromTime (u : FuturePointing d) : Path timeVecNormOneFuture u where
toFun t := ⟨
⟨{val := fun i => match i with
| Sum.inl 0 => √(1 + t ^ 2 * ‖u.1.1.toSpace‖ ^ 2)
| Sum.inr i => t * u.1.1.toSpace i},
by
rw [NormOne.mem_iff, contrContrContractField.as_sum_toSpace]
simp only [ContrMod.toSpace, Function.comp_apply, PiLp.inner_apply, RCLike.inner_apply, map_mul,
conj_trivial]
rw [Real.mul_self_sqrt, ← @real_inner_self_eq_norm_sq, @PiLp.inner_apply]
· simp only [Function.comp_apply, RCLike.inner_apply, conj_trivial]
refine Eq.symm (eq_sub_of_add_eq (congrArg (HAdd.hAdd _) ?_))
rw [Finset.mul_sum]
apply Finset.sum_congr rfl
intro i _
ring_nf
· exact Right.add_nonneg (zero_le_one' ) $ mul_nonneg (sq_nonneg _) (sq_nonneg _)⟩,
by
simp only [ContrMod.toSpace, Function.comp_apply, mem_iff_inl_nonneg, Real.sqrt_pos]
exact Real.sqrt_nonneg _⟩
continuous_toFun := by
refine Continuous.subtype_mk ?_ _
refine Continuous.subtype_mk ?_ _
refine continuous_contr _ ?_
apply (continuous_pi_iff).mpr
intro i
match i with
| Sum.inl 0 =>
continuity
| Sum.inr i =>
continuity
source' := by
ext
apply ContrMod.ext
funext i
match i with
| Sum.inl 0 =>
simp only [Set.Icc.coe_zero, ne_eq, OfNat.ofNat_ne_zero, not_false_eq_true, zero_pow,
zero_mul, add_zero, Real.sqrt_one, timeVecNormOneFuture, Fin.isValue,
ContrMod.stdBasis_apply_same]
| Sum.inr i =>
simp only [Set.Icc.coe_zero, zero_mul, timeVecNormOneFuture, Fin.isValue,
ContrMod.stdBasis_inl_apply_inr]
target' := by
ext
apply ContrMod.ext
funext i
match i with
| Sum.inl 0 =>
simp [Set.Icc.coe_one, one_pow, one_mul, Fin.isValue]
exact (inl_eq_sqrt u).symm
| Sum.inr i =>
simp only [Set.Icc.coe_one, one_pow, one_mul, Fin.isValue]
rfl
lemma isPathConnected : IsPathConnected (@Set.univ (FuturePointing d)) := by
use timeVecNormOneFuture
apply And.intro trivial ?_
intro y a
use pathFromTime y
exact fun _ => a
lemma metric_continuous (u : Contr d) :
Continuous (fun (a : FuturePointing d) => ⟪u, a.1.1⟫ₘ) := by
simp only [contrContrContractField.as_sum_toSpace]
refine Continuous.add ?_ ?_
· refine Continuous.comp' (continuous_mul_left _) $ Continuous.comp'
(continuous_apply (Sum.inl 0))
(Continuous.comp' ?_ ?_)
· exact continuous_iff_le_induced.mpr fun U a => a
· exact Continuous.comp' continuous_subtype_val continuous_subtype_val
· refine Continuous.comp' continuous_neg $ Continuous.inner
(Continuous.comp' (?_) continuous_const)
(Continuous.comp' (?_) (Continuous.comp'
continuous_subtype_val continuous_subtype_val))
· apply contr_continuous
exact Pi.continuous_precomp Sum.inr
· apply contr_continuous
exact Pi.continuous_precomp Sum.inr
end FuturePointing
end NormOne
end
end Contr

View file

@ -3,7 +3,8 @@ Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import HepLean.SpaceTime.LorentzVector.Basic
import Mathlib.Data.Complex.Exponential
import Mathlib.Analysis.InnerProductSpace.PiL2
import Mathlib.Algebra.Lie.Classical
/-!

View file

@ -1,241 +0,0 @@
/-
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import HepLean.SpaceTime.MinkowskiMatrix
/-!
# The Minkowski Metric
This file introduces the Minkowski metric on spacetime in the mainly-minus signature.
We define the Minkowski metric as a bilinear map on the vector space
of Lorentz vectors in d dimensions.
-/
open Matrix
open InnerProductSpace
/-!
# The definition of the Minkowski Metric
-/
/-- Given a Lorentz vector `v` we define the the linear map `w ↦ v * η * w`. -/
@[simps!]
def minkowskiLinearForm {d : } (v : LorentzVector d) : LorentzVector d →ₗ[] where
toFun w := v ⬝ᵥ (minkowskiMatrix *ᵥ w)
map_add' y z := by
noncomm_ring
rw [mulVec_add, dotProduct_add]
map_smul' c y := by
simp only [RingHom.id_apply, smul_eq_mul]
rw [mulVec_smul, dotProduct_smul]
rfl
/-- The Minkowski metric as a bilinear map. -/
def minkowskiMetric {d : } : LorentzVector d →ₗ[] LorentzVector d →ₗ[] where
toFun v := minkowskiLinearForm v
map_add' y z := by
ext1 x
simp only [minkowskiLinearForm_apply, LinearMap.add_apply]
apply add_dotProduct
map_smul' c y := by
ext1 x
simp only [minkowskiLinearForm_apply, RingHom.id_apply, LinearMap.smul_apply, smul_eq_mul]
rw [smul_dotProduct]
rfl
namespace minkowskiMetric
open minkowskiMatrix
open LorentzVector
variable {d : }
variable (v w : LorentzVector d)
/-- Notation for `minkowskiMetric`. -/
scoped[minkowskiMetric] notation:102 "⟪" v "," w "⟫ₘ" => minkowskiMetric v w
/-!
# Equalitites involving the Minkowski metric
-/
/-- The Minkowski metric expressed as a sum. -/
lemma as_sum :
⟪v, w⟫ₘ = v.time * w.time - ∑ i, v.space i * w.space i := by
simp only [minkowskiMetric, LinearMap.coe_mk, AddHom.coe_mk, minkowskiLinearForm_apply,
dotProduct, LieAlgebra.Orthogonal.indefiniteDiagonal, mulVec_diagonal, Fintype.sum_sum_type,
Finset.univ_unique, Fin.default_eq_zero, Fin.isValue, Sum.elim_inl, one_mul,
Finset.sum_singleton, Sum.elim_inr, neg_mul, mul_neg, Finset.sum_neg_distrib, time, space,
Function.comp_apply, minkowskiMatrix]
rfl
/-- The Minkowski metric expressed as a sum for a single vector. -/
lemma as_sum_self : ⟪v, v⟫ₘ = v.time ^ 2 - ‖v.space‖ ^ 2 := by
rw [← real_inner_self_eq_norm_sq, PiLp.inner_apply, as_sum]
noncomm_ring
lemma eq_time_minus_inner_prod : ⟪v, w⟫ₘ = v.time * w.time - ⟪v.space, w.space⟫_ := by
rw [as_sum, @PiLp.inner_apply]
rfl
lemma self_eq_time_minus_norm : ⟪v, v⟫ₘ = v.time ^ 2 - ‖v.space‖ ^ 2 := by
rw [← real_inner_self_eq_norm_sq, PiLp.inner_apply, as_sum]
noncomm_ring
/-- The Minkowski metric is symmetric in its arguments.. -/
lemma symm : ⟪v, w⟫ₘ = ⟪w, v⟫ₘ := by
simp only [as_sum]
ac_rfl
lemma time_sq_eq_metric_add_space : v.time ^ 2 = ⟪v, v⟫ₘ + ‖v.space‖ ^ 2 := by
rw [self_eq_time_minus_norm]
exact Eq.symm (sub_add_cancel (v.time ^ 2) (‖v.space‖ ^ 2))
/-!
# Minkowski metric and space reflections
-/
lemma right_spaceReflection : ⟪v, w.spaceReflection⟫ₘ = v.time * w.time + ⟪v.space, w.space⟫_ := by
rw [eq_time_minus_inner_prod, spaceReflection_space, spaceReflection_time]
simp only [time, Fin.isValue, space, inner_neg_right, PiLp.inner_apply, Function.comp_apply,
RCLike.inner_apply, conj_trivial, sub_neg_eq_add]
lemma self_spaceReflection_eq_zero_iff : ⟪v, v.spaceReflection⟫ₘ = 0 ↔ v = 0 := by
refine Iff.intro (fun h => ?_) (fun h => ?_)
· rw [right_spaceReflection] at h
have h2 : 0 ≤ ⟪v.space, v.space⟫_ := real_inner_self_nonneg
have h3 : v.time * v.time = 0 := by linarith [mul_self_nonneg v.time]
have h4 : ⟪v.space, v.space⟫_ = 0 := by linarith
simp only [time, Fin.isValue, mul_eq_zero, or_self] at h3
rw [@inner_self_eq_zero] at h4
funext i
rcases i with i | i
· fin_cases i
exact h3
· simpa using congrFun h4 i
· rw [h]
exact LinearMap.map_zero₂ minkowskiMetric (spaceReflection 0)
/-!
# Non degeneracy of the Minkowski metric
-/
/-- The metric tensor is non-degenerate. -/
lemma nondegenerate : (∀ w, ⟪w, v⟫ₘ = 0) ↔ v = 0 := by
refine Iff.intro (fun h => ?_) (fun h => ?_)
· exact (self_spaceReflection_eq_zero_iff _).mp ((symm _ _).trans $ h v.spaceReflection)
· simp [h]
/-!
# Inequalities involving the Minkowski metric
-/
lemma leq_time_sq : ⟪v, v⟫ₘ ≤ v.time ^ 2 := by
rw [time_sq_eq_metric_add_space]
exact (le_add_iff_nonneg_right _).mpr $ sq_nonneg ‖v.space‖
lemma ge_abs_inner_product : v.time * w.time - ‖⟪v.space, w.space⟫_‖ ≤ ⟪v, w⟫ₘ := by
rw [eq_time_minus_inner_prod, sub_le_sub_iff_left]
exact Real.le_norm_self ⟪v.space, w.space⟫_
lemma ge_sub_norm : v.time * w.time - ‖v.space‖ * ‖w.space‖ ≤ ⟪v, w⟫ₘ := by
apply le_trans _ (ge_abs_inner_product v w)
rw [sub_le_sub_iff_left]
exact norm_inner_le_norm v.space w.space
/-!
# The Minkowski metric and matrices
-/
section matrices
variable (Λ Λ' : Matrix (Fin 1 ⊕ Fin d) (Fin 1 ⊕ Fin d) )
@[simp]
lemma dual_mulVec_right : ⟪x, (dual Λ) *ᵥ y⟫ₘ = ⟪Λ *ᵥ x, y⟫ₘ := by
simp only [minkowskiMetric, LinearMap.coe_mk, AddHom.coe_mk, dual, minkowskiLinearForm_apply,
mulVec_mulVec, ← mul_assoc, minkowskiMatrix.sq, one_mul, (vecMul_transpose Λ x).symm, ←
dotProduct_mulVec]
@[simp]
lemma dual_mulVec_left : ⟪(dual Λ) *ᵥ x, y⟫ₘ = ⟪x, Λ *ᵥ y⟫ₘ := by
rw [symm, dual_mulVec_right, symm]
lemma matrix_apply_eq_iff_sub : ⟪v, Λ *ᵥ w⟫ₘ = ⟪v, Λ' *ᵥ w⟫ₘ ↔ ⟪v, (Λ - Λ') *ᵥ w⟫ₘ = 0 := by
rw [← sub_eq_zero, ← LinearMap.map_sub, sub_mulVec]
lemma matrix_eq_iff_eq_forall' : (∀ v, Λ *ᵥ v = Λ' *ᵥ v) ↔ ∀ w v, ⟪v, Λ *ᵥ w⟫ₘ = ⟪v, Λ' *ᵥ w⟫ₘ := by
refine Iff.intro (fun h ↦ fun w v ↦ ?_) (fun h ↦ fun v ↦ ?_)
· rw [h w]
· simp only [matrix_apply_eq_iff_sub] at h
refine sub_eq_zero.1 ?_
have h1 := h v
rw [nondegenerate] at h1
simp only [sub_mulVec] at h1
exact h1
lemma matrix_eq_iff_eq_forall : Λ = Λ' ↔ ∀ w v, ⟪v, Λ *ᵥ w⟫ₘ = ⟪v, Λ' *ᵥ w⟫ₘ := by
rw [← matrix_eq_iff_eq_forall']
refine Iff.intro (fun h => ?_) (fun h => ?_)
· exact fun _ => congrFun (congrArg mulVec h) _
· rw [← (LinearMap.toMatrix stdBasis stdBasis).toEquiv.symm.apply_eq_iff_eq]
ext x
simp only [LinearEquiv.coe_toEquiv_symm, LinearMap.toMatrix_symm, EquivLike.coe_coe,
toLin_apply, h, Fintype.sum_sum_type, Finset.univ_unique, Fin.default_eq_zero, Fin.isValue,
Finset.sum_singleton]
lemma matrix_eq_id_iff : Λ = 1 ↔ ∀ w v, ⟪v, Λ *ᵥ w⟫ₘ = ⟪v, w⟫ₘ := by
rw [matrix_eq_iff_eq_forall]
simp
/-!
# The Minkowski metric and the standard basis
-/
@[simp]
lemma basis_left (μ : Fin 1 ⊕ Fin d) : ⟪e μ, v⟫ₘ = η μ μ * v μ := by
rw [as_sum]
rcases μ with μ | μ
· fin_cases μ
simp [stdBasis_apply, minkowskiMatrix, LieAlgebra.Orthogonal.indefiniteDiagonal]
· simp [stdBasis_apply, minkowskiMatrix, LieAlgebra.Orthogonal.indefiniteDiagonal]
lemma on_timeVec : ⟪timeVec, @timeVec d⟫ₘ = 1 := by
simp only [timeVec, Fin.isValue, basis_left, minkowskiMatrix,
LieAlgebra.Orthogonal.indefiniteDiagonal, diagonal_apply_eq, Sum.elim_inl, stdBasis_apply,
↓reduceIte, mul_one]
lemma on_basis_mulVec (μ ν : Fin 1 ⊕ Fin d) : ⟪e μ, Λ *ᵥ e ν⟫ₘ = η μ μ * Λ μ ν := by
simp [basis_left, mulVec, dotProduct, stdBasis_apply]
lemma on_basis (μ ν : Fin 1 ⊕ Fin d) : ⟪e μ, e ν⟫ₘ = η μ ν := by
rw [basis_left, stdBasis_apply]
by_cases h : μ = ν
· simp [h]
· simp only [minkowskiMatrix, LieAlgebra.Orthogonal.indefiniteDiagonal, diagonal_apply_eq,
mul_ite, mul_one, mul_zero, ne_eq, h, not_false_eq_true, diagonal_apply_ne, ite_eq_right_iff]
exact fun a => False.elim (h (id (Eq.symm a)))
lemma matrix_apply_stdBasis (ν μ : Fin 1 ⊕ Fin d) :
Λ ν μ = η ν ν * ⟪e ν, Λ *ᵥ e μ⟫ₘ := by
rw [on_basis_mulVec, ← mul_assoc]
simp [η_apply_mul_η_apply_diag ν]
end matrices
end minkowskiMetric

View file

@ -131,14 +131,14 @@ def asConsTensor : 𝟙_ (Rep SL(2,)) ⟶ complexContr ⊗ leftHanded ⊗
map_sum, map_tmul]
symm
calc _ = ∑ x, ((complexContr.ρ M) (complexContrBasis x) ⊗ₜ[]
leftRightToMatrix.symm (SL2C.repSelfAdjointMatrix M (σSA x))) := by
leftRightToMatrix.symm (SL2C.toLinearMapSelfAdjointMatrix M (σSA x))) := by
refine Finset.sum_congr rfl (fun x _ => ?_)
rw [← leftRightToMatrix_ρ_symm_selfAdjoint]
rfl
_ = ∑ x, ((∑ i, (SL2C.toLorentzGroup M).1 i x • (complexContrBasis i)) ⊗ₜ[]
∑ j, leftRightToMatrix.symm ((SL2C.toLorentzGroup M⁻¹).1 x j • (σSA j))) := by
refine Finset.sum_congr rfl (fun x _ => ?_)
rw [SL2CRep_ρ_basis, SL2C.repSelfAdjointMatrix_σSA]
rw [SL2CRep_ρ_basis, SL2C.toLinearMapSelfAdjointMatrix_σSA]
simp only [Action.instMonoidalCategory_tensorObj_V, SL2C.toLorentzGroup_apply_coe,
Fintype.sum_sum_type, Finset.univ_unique, Fin.default_eq_zero, Fin.isValue,
Finset.sum_singleton, map_inv, lorentzGroupIsGroup_inv, AddSubgroup.coe_add,

View file

@ -4,9 +4,10 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import HepLean.SpaceTime.LorentzGroup.Basic
import HepLean.SpaceTime.LorentzVector.Real.Basic
import Mathlib.RepresentationTheory.Basic
import HepLean.SpaceTime.LorentzVector.AsSelfAdjointMatrix
import HepLean.SpaceTime.LorentzGroup.Restricted
import HepLean.SpaceTime.PauliMatrices.SelfAdjoint
import HepLean.Meta.Informal
/-!
# The group SL(2, ) and it's relation to the Lorentz group
@ -71,107 +72,90 @@ def toLinearMapSelfAdjointMatrix (M : SL(2, )) :
noncomm_ring [selfAdjoint.val_smul, Algebra.mul_smul_comm, Algebra.smul_mul_assoc,
RingHom.id_apply]
/-- The representation of `SL(2, )` on `selfAdjoint (Matrix (Fin 2) (Fin 2) )` given by
`M A ↦ M * A * Mᴴ`. -/
@[simps!]
def repSelfAdjointMatrix : Representation SL(2, ) $ selfAdjoint (Matrix (Fin 2) (Fin 2) ) where
toFun := toLinearMapSelfAdjointMatrix
lemma toLinearMapSelfAdjointMatrix_det (M : SL(2, )) (A : selfAdjoint (Matrix (Fin 2) (Fin 2) )) :
det ((toLinearMapSelfAdjointMatrix M) A).1 = det A.1 := by
simp only [LinearMap.coe_mk, AddHom.coe_mk, toLinearMapSelfAdjointMatrix, det_mul,
selfAdjoint.mem_iff, det_conjTranspose, det_mul, det_one, RingHom.id_apply]
simp only [SpecialLinearGroup.det_coe, one_mul, star_one, mul_one]
def toMatrix : SL(2, ) →* Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) where
toFun M := LinearMap.toMatrix PauliMatrix.σSAL PauliMatrix.σSAL (toLinearMapSelfAdjointMatrix M)
map_one' := by
noncomm_ring [toLinearMapSelfAdjointMatrix, SpecialLinearGroup.coe_one, one_mul,
conjTranspose_one, mul_one, Subtype.coe_eta]
simp only [toLinearMapSelfAdjointMatrix, SpecialLinearGroup.coe_one, one_mul, conjTranspose_one,
mul_one, Subtype.coe_eta]
erw [LinearMap.toMatrix_one]
map_mul' M N := by
ext x i j : 3
noncomm_ring [toLinearMapSelfAdjointMatrix, SpecialLinearGroup.coe_mul, mul_assoc,
conjTranspose_mul, LinearMap.coe_mk, AddHom.coe_mk, LinearMap.mul_apply]
simp only
rw [← LinearMap.toMatrix_mul]
apply congrArg
ext1 x
simp only [toLinearMapSelfAdjointMatrix, SpecialLinearGroup.coe_mul, conjTranspose_mul,
LinearMap.coe_mk, AddHom.coe_mk, LinearMap.mul_apply, Subtype.mk.injEq]
noncomm_ring
/-- The representation of `SL(2, )` on `spaceTime` obtained from `toSelfAdjointMatrix` and
`repSelfAdjointMatrix`. -/
def repLorentzVector : Representation SL(2, ) (LorentzVector 3) where
toFun M := toSelfAdjointMatrix.symm.comp ((repSelfAdjointMatrix M).comp
toSelfAdjointMatrix.toLinearMap)
map_one' := by
ext
simp
map_mul' M N := by
ext x : 3
simp
open Lorentz in
lemma toMatrix_apply_contrMod (M : SL(2, )) (v : ContrMod 3) :
(toMatrix M) *ᵥ v = ContrMod.toSelfAdjoint.symm
((toLinearMapSelfAdjointMatrix M) (ContrMod.toSelfAdjoint v)) := by
simp [toMatrix, LinearMap.toMatrix_apply, ContrMod.mulVec]
obtain ⟨a, ha⟩ := ContrMod.toSelfAdjoint.symm.surjective v
subst ha
rw [LinearEquiv.apply_symm_apply]
simp [ContrMod.toSelfAdjoint]
change ContrMod.toFin1dEquiv.symm ((
((LinearMap.toMatrix PauliMatrix.σSAL PauliMatrix.σSAL) (toLinearMapSelfAdjointMatrix M)))
*ᵥ (((Finsupp.linearEquivFunOnFinite (Fin 1 ⊕ Fin 3)) (PauliMatrix.σSAL.repr a)))) = _
apply congrArg
erw [LinearMap.toMatrix_mulVec_repr]
rfl
/-!
## Homomorphism to the Lorentz group
There is a group homomorphism from `SL(2, )` to the Lorentz group `𝓛`.
The purpose of this section is to define this homomorphism.
In the next section we will restrict this homomorphism to the restricted Lorentz group.
-/
lemma iff_det_selfAdjoint (Λ : Matrix (Fin 1 ⊕ Fin 3) (Fin 1 ⊕ Fin 3) ) : Λ ∈ LorentzGroup 3 ↔
∀ (x : selfAdjoint (Matrix (Fin 2) (Fin 2) )),
det ((toSelfAdjointMatrix ∘
toLin LorentzVector.stdBasis LorentzVector.stdBasis Λ ∘ toSelfAdjointMatrix.symm) x).1
= det x.1 := by
lemma toMatrix_mem_lorentzGroup (M : SL(2, )) : toMatrix M ∈ LorentzGroup 3 := by
rw [LorentzGroup.mem_iff_norm]
refine Iff.intro (fun h x => ?_) (fun h x => ?_)
· simpa [← det_eq_ηLin] using congrArg ofReal $ h (toSelfAdjointMatrix.symm x)
· simpa [det_eq_ηLin] using h (toSelfAdjointMatrix x)
intro x
apply ofReal_injective
rw [Lorentz.contrContrContractField.same_eq_det_toSelfAdjoint]
rw [toMatrix_apply_contrMod]
rw [LinearEquiv.apply_symm_apply]
rw [toLinearMapSelfAdjointMatrix_det]
rw [Lorentz.contrContrContractField.same_eq_det_toSelfAdjoint]
/-- Given an element `M ∈ SL(2, )` the corresponding element of the Lorentz group. -/
@[simps!]
def toLorentzGroupElem (M : SL(2, )) : LorentzGroup 3 :=
⟨LinearMap.toMatrix LorentzVector.stdBasis LorentzVector.stdBasis (repLorentzVector M),
by simp [repLorentzVector, iff_det_selfAdjoint]⟩
/-- The group homomorphism from ` SL(2, )` to the Lorentz group `𝓛`. -/
/-- The group homomorphism from `SL(2, )` to the Lorentz group `𝓛`. -/
@[simps!]
def toLorentzGroup : SL(2, ) →* LorentzGroup 3 where
toFun := toLorentzGroupElem
toFun M := ⟨toMatrix M, toMatrix_mem_lorentzGroup M⟩
map_one' := by
simp only [toLorentzGroupElem, _root_.map_one, LinearMap.toMatrix_one]
simp only [_root_.map_one]
rfl
map_mul' M N := by
apply Subtype.eq
simp only [toLorentzGroupElem, _root_.map_mul, LinearMap.toMatrix_mul,
lorentzGroupIsGroup_mul_coe]
ext1
simp only [_root_.map_mul, lorentzGroupIsGroup_mul_coe]
lemma toLorentzGroup_eq_σSAL (M : SL(2, )) :
toLorentzGroup M = LinearMap.toMatrix
PauliMatrix.σSAL PauliMatrix.σSAL (repSelfAdjointMatrix M) := by
PauliMatrix.σSAL PauliMatrix.σSAL (toLinearMapSelfAdjointMatrix M) := by
rfl
lemma toLorentzGroup_eq_stdBasis (M : SL(2, )) :
toLorentzGroup M = LinearMap.toMatrix LorentzVector.stdBasis LorentzVector.stdBasis
(repLorentzVector M) := by rfl
lemma repLorentzVector_apply_eq_mulVec (v : LorentzVector 3) :
SL2C.repLorentzVector M v = (SL2C.toLorentzGroup M).1 *ᵥ v := by
simp only [toLorentzGroup, MonoidHom.coe_mk, OneHom.coe_mk, toLorentzGroupElem_coe]
have hv : v = (Finsupp.linearEquivFunOnFinite (Fin 1 ⊕ Fin 3))
(LorentzVector.stdBasis.repr v) := by rfl
nth_rewrite 2 [hv]
change _ = toLorentzGroup M *ᵥ (LorentzVector.stdBasis.repr v)
rw [toLorentzGroup_eq_stdBasis, LinearMap.toMatrix_mulVec_repr]
rfl
lemma repSelfAdjointMatrix_basis (i : Fin 1 ⊕ Fin 3) :
SL2C.repSelfAdjointMatrix M (PauliMatrix.σSAL i) =
lemma toLinearMapSelfAdjointMatrix_basis (i : Fin 1 ⊕ Fin 3) :
toLinearMapSelfAdjointMatrix M (PauliMatrix.σSAL i) =
∑ j, (toLorentzGroup M).1 j i •
PauliMatrix.σSAL j := by
rw [toLorentzGroup_eq_σSAL]
simp only [LinearMap.toMatrix_apply, Finset.univ_unique,
Fin.default_eq_zero, Fin.isValue, Finset.sum_singleton]
nth_rewrite 1 [← (Basis.sum_repr PauliMatrix.σSAL
((repSelfAdjointMatrix M) (PauliMatrix.σSAL i)))]
((toLinearMapSelfAdjointMatrix M) (PauliMatrix.σSAL i)))]
rfl
lemma repSelfAdjointMatrix_σSA (i : Fin 1 ⊕ Fin 3) :
SL2C.repSelfAdjointMatrix M (PauliMatrix.σSA i) =
lemma toLinearMapSelfAdjointMatrix_σSA (i : Fin 1 ⊕ Fin 3) :
toLinearMapSelfAdjointMatrix M (PauliMatrix.σSA i) =
∑ j, (toLorentzGroup M⁻¹).1 i j • PauliMatrix.σSA j := by
have h1 : (toLorentzGroup M⁻¹).1 = minkowskiMatrix.dual (toLorentzGroup M).1 := by
simp
simp only [h1]
rw [PauliMatrix.σSA_minkowskiMetric_σSAL, _root_.map_smul]
rw [repSelfAdjointMatrix_basis]
rw [toLinearMapSelfAdjointMatrix_basis]
rw [Finset.smul_sum]
apply congrArg
funext j
@ -180,18 +164,6 @@ lemma repSelfAdjointMatrix_σSA (i : Fin 1 ⊕ Fin 3) :
apply congrArg
exact Eq.symm (minkowskiMatrix.dual_apply_minkowskiMatrix ((toLorentzGroup M).1) i j)
lemma repLorentzVector_stdBasis (i : Fin 1 ⊕ Fin 3) :
SL2C.repLorentzVector M (LorentzVector.stdBasis i) =
∑ j, (toLorentzGroup M).1 j i • LorentzVector.stdBasis j := by
simp only [repLorentzVector, MonoidHom.coe_mk, OneHom.coe_mk, LinearMap.coe_comp,
LinearEquiv.coe_coe, Function.comp_apply]
rw [toSelfAdjointMatrix_stdBasis]
rw [repSelfAdjointMatrix_basis]
rw [map_sum]
apply congrArg
funext j
simp
/-!
## Homomorphism to the restricted Lorentz group
@ -205,13 +177,13 @@ informal_lemma toLorentzGroup_det_one where
math :≈ "The determinant of the image of `SL(2, )` in the Lorentz group is one."
deps :≈ [``toLorentzGroup]
informal_lemma toLorentzGroup_timeComp_nonneg where
informal_lemma toLorentzGroup_inl_inl_nonneg where
math :≈ "The time coponent of the image of `SL(2, )` in the Lorentz group is non-negative."
deps :≈ [``toLorentzGroup, ``LorentzGroup.timeComp]
deps :≈ [``toLorentzGroup]
informal_lemma toRestrictedLorentzGroup where
math :≈ "The homomorphism from `SL(2, )` to the restricted Lorentz group."
deps :≈ [``toLorentzGroup, ``toLorentzGroup_det_one, ``toLorentzGroup_timeComp_nonneg,
deps :≈ [``toLorentzGroup, ``toLorentzGroup_det_one, ``toLorentzGroup_inl_inl_nonneg,
``LorentzGroup.Restricted]
/-! TODO: Define homomorphism from `SL(2, )` to the restricted Lorentz group. -/

View file

@ -719,10 +719,10 @@ lemma altLeftAltRightToMatrix_ρ_symm_selfAdjoint (v : Matrix (Fin 2) (Fin 2)
(hv : IsSelfAdjoint v) (M : SL(2,)) :
TensorProduct.map (altLeftHanded.ρ M) (altRightHanded.ρ M) (altLeftAltRightToMatrix.symm v) =
altLeftAltRightToMatrix.symm
(SL2C.repSelfAdjointMatrix (M.transpose⁻¹) ⟨v, hv⟩) := by
(SL2C.toLinearMapSelfAdjointMatrix (M.transpose⁻¹) ⟨v, hv⟩) := by
rw [altLeftAltRightToMatrix_ρ_symm]
apply congrArg
simp only [SL2C.repSelfAdjointMatrix, MonoidHom.coe_mk, OneHom.coe_mk,
simp only [ MonoidHom.coe_mk, OneHom.coe_mk,
SL2C.toLinearMapSelfAdjointMatrix_apply_coe, SpecialLinearGroup.coe_inv,
SpecialLinearGroup.coe_transpose]
congr
@ -738,7 +738,7 @@ lemma leftRightToMatrix_ρ_symm_selfAdjoint (v : Matrix (Fin 2) (Fin 2) )
(hv : IsSelfAdjoint v) (M : SL(2,)) :
TensorProduct.map (leftHanded.ρ M) (rightHanded.ρ M) (leftRightToMatrix.symm v) =
leftRightToMatrix.symm
(SL2C.repSelfAdjointMatrix M ⟨v, hv⟩) := by
(SL2C.toLinearMapSelfAdjointMatrix M ⟨v, hv⟩) := by
rw [leftRightToMatrix_ρ_symm]
rfl