refactor: Major refactor of lorentz group

This commit is contained in:
jstoobysmith 2024-07-01 16:56:15 -04:00
parent 0116994a58
commit 675b9a989a
11 changed files with 866 additions and 208 deletions

View file

@ -3,8 +3,9 @@ Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license.
Authors: Joseph Tooby-Smith
-/
import HepLean.SpaceTime.Metric
import HepLean.SpaceTime.MinkowskiMetric
import HepLean.SpaceTime.AsSelfAdjointMatrix
import HepLean.SpaceTime.LorentzVector.NormOne
/-!
# The Lorentz Group
@ -26,7 +27,6 @@ identity.
noncomputable section
namespace SpaceTime
open Manifold
open Matrix
@ -34,146 +34,139 @@ open Complex
open ComplexConjugate
/-!
## Matrices which preserve `ηLin`
## Matrices which preserves the Minkowski metric
We start studying the properties of matrices which preserve `ηLin`.
These matrices form the Lorentz group, which we will define in the next section at `lorentzGroup`.
-/
variable {d : }
/-- We say a matrix `Λ` preserves `ηLin` if for all `x` and `y`,
`ηLin (Λ *ᵥ x) (Λ *ᵥ y) = ηLin x y`. -/
def PreservesηLin (Λ : Matrix (Fin 4) (Fin 4) ) : Prop :=
∀ (x y : SpaceTime), ηLin (Λ *ᵥ x) (Λ *ᵥ y) = ηLin x y
open minkowskiMetric in
/-- The Lorentz group is the subset of matrices which preserve the minkowski metric. -/
def LorentzGroup (d : ) : Set (Matrix (Fin 1 ⊕ Fin d) (Fin 1 ⊕ Fin d) ) :=
{Λ : Matrix (Fin 1 ⊕ Fin d) (Fin 1 ⊕ Fin d) |
∀ (x y : LorentzVector d), ⟪Λ *ᵥ x, Λ *ᵥ y⟫ₘ = ⟪x, y⟫ₘ}
namespace PreservesηLin
variable (Λ : Matrix (Fin 4) (Fin 4) )
namespace LorentzGroup
/-- Notation for the Lorentz group. -/
scoped[LorentzGroup] notation (name := lorentzGroup_notation) "𝓛" => LorentzGroup
lemma iff_norm : PreservesηLin Λ ↔
∀ (x : SpaceTime), ηLin (Λ *ᵥ x) (Λ *ᵥ x) = ηLin x x := by
open minkowskiMetric
variable {Λ Λ' : Matrix (Fin 1 ⊕ Fin d) (Fin 1 ⊕ Fin d) }
/-!
# Membership conditions
-/
lemma mem_iff_norm : Λ ∈ LorentzGroup d ↔
∀ (x : LorentzVector d), ⟪Λ *ᵥ x, Λ *ᵥ x⟫ₘ = ⟪x, x⟫ₘ := by
refine Iff.intro (fun h x => h x x) (fun h x y => ?_)
have hp := h (x + y)
have hn := h (x - y)
rw [mulVec_add] at hp
rw [mulVec_sub] at hn
simp only [map_add, LinearMap.add_apply, map_sub, LinearMap.sub_apply] at hp hn
rw [ηLin_symm (Λ *ᵥ y) (Λ *ᵥ x), ηLin_symm y x] at hp hn
rw [symm (Λ *ᵥ y) (Λ *ᵥ x), symm y x] at hp hn
linear_combination hp / 4 + -1 * hn / 4
lemma iff_det_selfAdjoint : PreservesηLin Λ ↔
∀ (x : selfAdjoint (Matrix (Fin 2) (Fin 2) )),
det ((toSelfAdjointMatrix ∘ toLin stdBasis stdBasis Λ ∘ toSelfAdjointMatrix.symm) x).1
= det x.1 := by
rw [iff_norm]
apply Iff.intro
intro h x
have h1 := congrArg ofReal $ h (toSelfAdjointMatrix.symm x)
simpa [← det_eq_ηLin] using h1
intro h x
have h1 := h (toSelfAdjointMatrix x)
simpa [det_eq_ηLin] using h1
lemma iff_on_right : PreservesηLin Λ ↔
∀ (x y : SpaceTime), ηLin x ((η * Λᵀ * η * Λ) *ᵥ y) = ηLin x y := by
lemma mem_iff_on_right : Λ ∈ LorentzGroup d ↔
∀ (x y : LorentzVector d), ⟪x, (dual Λ * Λ) *ᵥ y⟫ₘ = ⟪x, y⟫ₘ := by
apply Iff.intro
intro h x y
have h1 := h x y
rw [ηLin_mulVec_left, mulVec_mulVec] at h1
rw [← dual_mulVec_right, mulVec_mulVec] at h1
exact h1
intro h x y
rw [ηLin_mulVec_left, mulVec_mulVec]
rw [← dual_mulVec_right, mulVec_mulVec]
exact h x y
lemma iff_matrix : PreservesηLin Λ ↔ η * Λᵀ * η * Λ = 1 := by
rw [iff_on_right, ηLin_matrix_eq_identity_iff (η * Λᵀ * η * Λ)]
apply Iff.intro
· simp_all [ηLin, implies_true, iff_true, one_mulVec]
· exact fun a x y => Eq.symm (Real.ext_cauchy (congrArg Real.cauchy (a x y)))
lemma mem_iff_dual_mul_self : Λ ∈ LorentzGroup d ↔ dual Λ * Λ = 1 := by
rw [mem_iff_on_right, matrix_eq_id_iff]
exact forall_comm
lemma iff_matrix' : PreservesηLin Λ ↔ Λ * (η * Λᵀ * η) = 1 := by
rw [iff_matrix]
lemma mem_iff_self_mul_dual : Λ ∈ LorentzGroup d ↔ Λ * dual Λ = 1 := by
rw [mem_iff_dual_mul_self]
exact mul_eq_one_comm
lemma iff_transpose : PreservesηLin Λ ↔ PreservesηLin Λᵀ := by
lemma mem_iff_transpose : Λ ∈ LorentzGroup d ↔ Λᵀ ∈ LorentzGroup d := by
apply Iff.intro
intro h
have h1 := congrArg transpose ((iff_matrix Λ).mp h)
rw [transpose_mul, transpose_mul, transpose_mul, η_transpose,
← mul_assoc, transpose_one] at h1
rw [iff_matrix' Λ.transpose, ← h1]
noncomm_ring
intro h
have h1 := congrArg transpose ((iff_matrix Λ.transpose).mp h)
rw [transpose_mul, transpose_mul, transpose_mul, η_transpose,
← mul_assoc, transpose_one, transpose_transpose] at h1
rw [iff_matrix', ← h1]
· intro h
have h1 := congrArg transpose ((mem_iff_dual_mul_self).mp h)
rw [dual, transpose_mul, transpose_mul, transpose_mul, minkowskiMatrix.eq_transpose,
← mul_assoc, transpose_one] at h1
rw [mem_iff_self_mul_dual, ← h1, dual]
noncomm_ring
· intro h
have h1 := congrArg transpose ((mem_iff_dual_mul_self).mp h)
rw [dual, transpose_mul, transpose_mul, transpose_mul, minkowskiMatrix.eq_transpose,
← mul_assoc, transpose_one, transpose_transpose] at h1
rw [mem_iff_self_mul_dual, ← h1, dual]
noncomm_ring
lemma mem_mul (hΛ : Λ ∈ LorentzGroup d) (hΛ' : Λ' ∈ LorentzGroup d) : Λ * Λ' ∈ LorentzGroup d := by
rw [mem_iff_dual_mul_self, dual_mul]
trans dual Λ' * (dual Λ * Λ) * Λ'
noncomm_ring
rw [(mem_iff_dual_mul_self).mp hΛ]
simp [(mem_iff_dual_mul_self).mp hΛ']
/-- The lift of a matrix which preserves `ηLin` to an invertible matrix. -/
def liftGL {Λ : Matrix (Fin 4) (Fin 4) } (h : PreservesηLin Λ) : GL (Fin 4) :=
⟨Λ, η * Λᵀ * η , (iff_matrix' Λ).mp h , (iff_matrix Λ).mp h⟩
lemma mul {Λ Λ' : Matrix (Fin 4) (Fin 4) } (h : PreservesηLin Λ) (h' : PreservesηLin Λ') :
PreservesηLin (Λ * Λ') := by
intro x y
rw [← mulVec_mulVec, ← mulVec_mulVec, h, h']
lemma one : PreservesηLin 1 := by
intro x y
lemma one_mem : 1 ∈ LorentzGroup d := by
rw [mem_iff_dual_mul_self]
simp
lemma η : PreservesηLin η := by
simp [iff_matrix, η_transpose, η_sq]
lemma dual_mem (h : Λ ∈ LorentzGroup d) : dual Λ ∈ LorentzGroup d := by
rw [mem_iff_dual_mul_self, dual_dual]
exact mem_iff_self_mul_dual.mp h
end PreservesηLin
end LorentzGroup
/-!
## The Lorentz group
We define the Lorentz group as the set of matrices which preserve `ηLin`.
We show that the Lorentz group is indeed a group.
# The Lorentz group as a group
-/
/-- The Lorentz group is the subset of matrices which preserve ηLin. -/
def LorentzGroup : Type := {Λ : Matrix (Fin 4) (Fin 4) // PreservesηLin Λ}
@[simps mul_coe one_coe inv div]
instance lorentzGroupIsGroup : Group LorentzGroup where
mul A B := ⟨A.1 * B.1, PreservesηLin.mul A.2 B.2⟩
instance lorentzGroupIsGroup : Group (LorentzGroup d) where
mul A B := ⟨A.1 * B.1, LorentzGroup.mem_mul A.2 B.2⟩
mul_assoc A B C := by
apply Subtype.eq
exact Matrix.mul_assoc A.1 B.1 C.1
one := ⟨1, PreservesηLin.one
one := ⟨1, LorentzGroup.one_mem
one_mul A := by
apply Subtype.eq
exact Matrix.one_mul A.1
mul_one A := by
apply Subtype.eq
exact Matrix.mul_one A.1
inv A := ⟨η * A.1ᵀ * η , PreservesηLin.mul (PreservesηLin.mul PreservesηLin.η
((PreservesηLin.iff_transpose A.1).mp A.2)) PreservesηLin.η⟩
inv A := ⟨minkowskiMetric.dual A.1, LorentzGroup.dual_mem A.2⟩
mul_left_inv A := by
apply Subtype.eq
exact (PreservesηLin.iff_matrix A.1).mp A.2
exact LorentzGroup.mem_iff_dual_mul_self.mp A.2
/-- Notation for the Lorentz group. -/
scoped[SpaceTime] notation (name := lorentzGroup_notation) "𝓛" => LorentzGroup
/-- `lorentzGroup` has the subtype topology. -/
instance : TopologicalSpace LorentzGroup := instTopologicalSpaceSubtype
/-- `LorentzGroup` has the subtype topology. -/
instance : TopologicalSpace (LorentzGroup d) := instTopologicalSpaceSubtype
namespace LorentzGroup
lemma coe_inv (A : LorentzGroup) : (A⁻¹).1 = A.1⁻¹:= by
open minkowskiMetric
variable {Λ Λ' : LorentzGroup d}
@[simp]
lemma coe_inv : (Λ⁻¹).1 = Λ.1⁻¹:= by
refine (inv_eq_left_inv ?h).symm
exact (PreservesηLin.iff_matrix A.1).mp A.2
exact mem_iff_dual_mul_self.mp Λ.2
/-- The transpose of an matrix in the Lorentz group is an element of the Lorentz group. -/
def transpose (Λ : LorentzGroup) : LorentzGroup := ⟨Λ.1ᵀ, (PreservesηLin.iff_transpose Λ.1).mp Λ.2⟩
def transpose (Λ : LorentzGroup d) : LorentzGroup d :=
⟨Λ.1ᵀ, mem_iff_transpose.mp Λ.2⟩
/-!
@ -186,9 +179,9 @@ embedding.
-/
/-- The homomorphism of the Lorentz group into `GL (Fin 4) `. -/
def toGL : LorentzGroup →* GL (Fin 4) where
toFun A := ⟨A.1, (A⁻¹).1, mul_eq_one_comm.mpr $ (PreservesηLin.iff_matrix A.1).mp A.2,
(PreservesηLin.iff_matrix A.1).mp A.2⟩
def toGL : LorentzGroup d →* GL (Fin 1 ⊕ Fin d) where
toFun A := ⟨A.1, (A⁻¹).1, mul_eq_one_comm.mpr $ mem_iff_dual_mul_self.mp A.2,
mem_iff_dual_mul_self.mp A.2⟩
map_one' := by
simp
rfl
@ -197,7 +190,7 @@ def toGL : LorentzGroup →* GL (Fin 4) where
ext
rfl
lemma toGL_injective : Function.Injective toGL := by
lemma toGL_injective : Function.Injective (@toGL d) := by
intro A B h
apply Subtype.eq
rw [@Units.ext_iff] at h
@ -206,20 +199,21 @@ lemma toGL_injective : Function.Injective toGL := by
/-- The homomorphism from the Lorentz Group into the monoid of matrices times the opposite of
the monoid of matrices. -/
@[simps!]
def toProd : LorentzGroup →* (Matrix (Fin 4) (Fin 4) ) × (Matrix (Fin 4) (Fin 4) )ᵐᵒᵖ :=
def toProd : LorentzGroup d →* (Matrix (Fin 1 ⊕ Fin d) (Fin 1 ⊕ Fin d) ) ×
(Matrix (Fin 1 ⊕ Fin d) (Fin 1 ⊕ Fin d) )ᵐᵒᵖ :=
MonoidHom.comp (Units.embedProduct _) toGL
lemma toProd_eq_transpose_η : toProd A = (A.1, ⟨η * A.1ᵀ * η⟩) := rfl
lemma toProd_eq_transpose_η : toProd Λ = (Λ.1, MulOpposite.op $ minkowskiMetric.dual Λ.1) := rfl
lemma toProd_injective : Function.Injective toProd := by
lemma toProd_injective : Function.Injective (@toProd d) := by
intro A B h
rw [toProd_eq_transpose_η, toProd_eq_transpose_η] at h
rw [@Prod.mk.inj_iff] at h
apply Subtype.eq
exact h.1
lemma toProd_continuous : Continuous toProd := by
change Continuous (fun A => (A.1, ⟨η * A.1ᵀ * η⟩))
lemma toProd_continuous : Continuous (@toProd d) := by
change Continuous (fun A => (A.1, ⟨dual A.1⟩))
refine continuous_prod_mk.mpr (And.intro ?_ ?_)
exact continuous_iff_le_induced.mpr fun U a => a
refine Continuous.comp' ?_ ?_
@ -230,7 +224,7 @@ lemma toProd_continuous : Continuous toProd := by
/-- The embedding from the Lorentz Group into the monoid of matrices times the opposite of
the monoid of matrices. -/
lemma toProd_embedding : Embedding toProd where
lemma toProd_embedding : Embedding (@toProd d) where
inj := toProd_injective
induced := by
refine (inducing_iff ⇑toProd).mp ?_
@ -238,7 +232,7 @@ lemma toProd_embedding : Embedding toProd where
exact (inducing_iff (Prod.fst ∘ ⇑toProd)).mpr rfl
/-- The embedding from the Lorentz Group into `GL (Fin 4) `. -/
lemma toGL_embedding : Embedding toGL.toFun where
lemma toGL_embedding : Embedding (@toGL d).toFun where
inj := toGL_injective
induced := by
refine ((fun {X} {t t'} => TopologicalSpace.ext_iff.mpr) ?_).symm
@ -248,11 +242,48 @@ lemma toGL_embedding : Embedding toGL.toFun where
exact exists_exists_and_eq_and
instance : TopologicalGroup LorentzGroup := Inducing.topologicalGroup toGL toGL_embedding.toInducing
instance : TopologicalGroup (LorentzGroup d) :=
Inducing.topologicalGroup toGL toGL_embedding.toInducing
section
open LorentzVector
/-!
# To a norm one Lorentz vector
-/
/-- The first column of a lorentz matrix as a `NormOneLorentzVector`. -/
@[simps!]
def toNormOneLorentzVector (Λ : LorentzGroup d) : NormOneLorentzVector d :=
⟨Λ.1 *ᵥ timeVec, by rw [NormOneLorentzVector.mem_iff, Λ.2, minkowskiMetric.on_timeVec]⟩
/-!
# The time like element
-/
/-- The time like element of a Lorentz matrix. -/
@[simp]
def timeComp (Λ : LorentzGroup d) : := Λ.1 (Sum.inl 0) (Sum.inl 0)
lemma timeComp_eq_toNormOneLorentzVector : timeComp Λ = (toNormOneLorentzVector Λ).1.time := by
simp only [time, toNormOneLorentzVector, timeVec, Fin.isValue, timeComp]
erw [Pi.basisFun_apply, mulVec_stdBasis]
lemma timeComp_mul (Λ Λ' : LorentzGroup d) : timeComp (Λ * Λ') =
⟪toNormOneLorentzVector (transpose Λ), (toNormOneLorentzVector Λ').1.spaceReflection⟫ₘ := by
simp only [timeComp, Fin.isValue, lorentzGroupIsGroup_mul_coe, mul_apply, Fintype.sum_sum_type,
Finset.univ_unique, Fin.default_eq_zero, Finset.sum_singleton, toNormOneLorentzVector,
transpose, timeVec, right_spaceReflection, time, space, PiLp.inner_apply, Function.comp_apply,
RCLike.inner_apply, conj_trivial]
erw [Pi.basisFun_apply, mulVec_stdBasis]
simp
end
end LorentzGroup
end SpaceTime