Imports
/- 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 -/ module public import Physlib.Relativity.SL2C.SelfAdjoint public import Mathlib.Analysis.Complex.Polynomial.Basic public import Physlib.Relativity.LorentzGroup.Restricted.Basic

The group SL(2, ℂ) and it's relation to the Lorentz group

The aim of this file is to give the relationship between SL(2, ℂ) and the Lorentz group.

@[expose] public section

Some basic properties about SL(2, ℂ)

Possibly to be moved to mathlib at some point.

M:SL(2, )Ring.inverse 1 (↑M).adjugate = (↑M).adjugate All goals completed! 🐙lemma transpose_coe (M : SL(2, )) : M.1 = (M.transpose).1 := rfl

Representation of SL(2, ℂ) on spacetime

Through the correspondence between spacetime and self-adjoint matrices, we can define a representation a representation of SL(2, ℂ) on spacetime.

Given an element M ∈ SL(2, ℂ) the linear map from selfAdjoint (Matrix (Fin 2) (Fin 2) ℂ) to itself defined by A ↦ M * A * Mᴴ.

@[simps!] noncomputable def toSelfAdjointMap (M : SL(2, )) : selfAdjoint (Matrix (Fin 2) (Fin 2) ) →ₗ[] selfAdjoint (Matrix (Fin 2) (Fin 2) ) where toFun A := M.1 * A.1 * Matrix.conjTranspose M, M:SL(2, )A:(selfAdjoint ℂ²ˣ²)M * A * (↑M) selfAdjoint ℂ²ˣ² All goals completed! 🐙 map_add' A B := M:SL(2, )A:(selfAdjoint ℂ²ˣ²)B:(selfAdjoint ℂ²ˣ²)M * (A + B) * (↑M), = M * A * (↑M), + M * B * (↑M), M:SL(2, )A:(selfAdjoint ℂ²ˣ²)B:(selfAdjoint ℂ²ˣ²)M * (A + B) * (↑M) = M * A * (↑M) + M * B * (↑M) All goals completed! 🐙 map_smul' r A := M:SL(2, )r:A:(selfAdjoint ℂ²ˣ²)M * (r A) * (↑M), = (RingHom.id ) r M * A * (↑M), All goals completed! 🐙
lemma toSelfAdjointMap_apply (A : selfAdjoint (Matrix (Fin 2) (Fin 2) )) : toSelfAdjointMap M A = M.1 * A.1 * Matrix.conjTranspose M, M:SL(2, )A:(selfAdjoint ℂ²ˣ²)M * A * (↑M) selfAdjoint ℂ²ˣ² All goals completed! 🐙 := rfllemma toSelfAdjointMap_apply_det (M : SL(2, )) (A : selfAdjoint (Matrix (Fin 2) (Fin 2) )) : det ((toSelfAdjointMap M) A).1 = det A.1 := M:SL(2, )A:(selfAdjoint ℂ²ˣ²)(↑((toSelfAdjointMap M) A)).det = (↑A).det All goals completed! 🐙M:SL(2, )x:Fin (Nat.succ 1)y:Fin 2((M 1 0).re + (M 1 0).im * I) * (starRingEnd ) ((M 0 0).re + (M 0 0).im * I) + ((M 1 1).re + (M 1 1).im * I) * (starRingEnd ) ((M 0 1).re + (M 0 1).im * I) = ((M 0 1).re + (M 0 1).im * I).re * ((M 1 1).re + (M 1 1).im * I).re + ((M 0 1).re + (M 0 1).im * I).re * ((M 1 1).re + (M 1 1).im * I).im * I - ((M 1 1).re + (M 1 1).im * I).re * ((M 0 1).re + (M 0 1).im * I).im * I + ((M 0 1).re + (M 0 1).im * I).im * ((M 1 1).re + (M 1 1).im * I).im + ((M 0 0).re + (M 0 0).im * I).im * ((M 1 0).re + (M 1 0).im * I).im - ((M 0 0).re + (M 0 0).im * I).im * ((M 1 0).re + (M 1 0).im * I).re * I + ((M 1 0).re + (M 1 0).im * I).im * ((M 0 0).re + (M 0 0).im * I).re * I + ((M 0 0).re + (M 0 0).im * I).re * ((M 1 0).re + (M 1 0).im * I).re M:SL(2, )x:Fin (Nat.succ 1)y:Fin 2((M 1 0).re + (M 1 0).im * I) * ((M 0 0).re + -((M 0 0).im * I)) + ((M 1 1).re + (M 1 1).im * I) * ((M 0 1).re + -((M 0 1).im * I)) = (M 0 1).re * (M 1 1).re + (M 0 1).re * (M 1 1).im * I - (M 1 1).re * (M 0 1).im * I + (M 0 1).im * (M 1 1).im + (M 0 0).im * (M 1 0).im - (M 0 0).im * (M 1 0).re * I + (M 1 0).im * (M 0 0).re * I + (M 0 0).re * (M 1 0).re M:SL(2, )x:Fin (Nat.succ 1)y:Fin 2-((M 1 0).re * I * (M 0 0).im) + (M 1 0).re * (M 0 0).re + (M 1 0).im * I * (M 0 0).re - (M 1 0).im * I ^ 2 * (M 0 0).im - I * (M 1 1).re * (M 0 1).im + I * (M 1 1).im * (M 0 1).re - I ^ 2 * (M 1 1).im * (M 0 1).im + (M 1 1).re * (M 0 1).re = -((M 1 0).re * I * (M 0 0).im) + (M 1 0).re * (M 0 0).re + (M 1 0).im * I * (M 0 0).re + (M 1 0).im * (M 0 0).im - I * (M 1 1).re * (M 0 1).im + I * (M 1 1).im * (M 0 1).re + (M 1 1).re * (M 0 1).re + (M 1 1).im * (M 0 1).im M:SL(2, )x:Fin (Nat.succ 1)y:Fin 2-((M 1 0).re * I * (M 0 0).im) + (M 1 0).re * (M 0 0).re + (M 1 0).im * I * (M 0 0).re + (M 1 0).im * (M 0 0).im - I * (M 1 1).re * (M 0 1).im + I * (M 1 1).im * (M 0 1).re + (M 1 1).im * (M 0 1).im + (M 1 1).re * (M 0 1).re = -((M 1 0).re * I * (M 0 0).im) + (M 1 0).re * (M 0 0).re + (M 1 0).im * I * (M 0 0).re + (M 1 0).im * (M 0 0).im - I * (M 1 1).re * (M 0 1).im + I * (M 1 1).im * (M 0 1).re + (M 1 1).re * (M 0 1).re + (M 1 1).im * (M 0 1).im All goals completed! 🐙

The monoid homomorphisms from SL(2, ℂ) to matrices indexed by Fin 1 ⊕ Fin 3 formed by the action M A Mᴴ.

M:SL(2, )N:SL(2, )(LinearMap.toMatrix PauliMatrix.pauliBasis' PauliMatrix.pauliBasis') (toSelfAdjointMap (M * N)) = (LinearMap.toMatrix PauliMatrix.pauliBasis' PauliMatrix.pauliBasis') (toSelfAdjointMap M * toSelfAdjointMap N) M:SL(2, )N:SL(2, )toSelfAdjointMap (M * N) = toSelfAdjointMap M * toSelfAdjointMap N M:SL(2, )N:SL(2, )x:(selfAdjoint ℂ²ˣ²)(toSelfAdjointMap (M * N)) x = (toSelfAdjointMap M * toSelfAdjointMap N) x erw [M:SL(2, )N:SL(2, )x:(selfAdjoint ℂ²ˣ²)(toSelfAdjointMap (M * N)) x = (toSelfAdjointMap M) ((toSelfAdjointMap N) x)M:SL(2, )N:SL(2, )x:(selfAdjoint ℂ²ˣ²)(toSelfAdjointMap (M * N)) x = (toSelfAdjointMap M) ((toSelfAdjointMap N) x) M:SL(2, )N:SL(2, )x:(selfAdjoint ℂ²ˣ²)M * N * x * ((↑N) * (↑M)) = M * (N * x * (↑N)) * (↑M) M:SL(2, )N:SL(2, )x:(selfAdjoint ℂ²ˣ²)i✝:Fin 2j✝:Fin 2(M * N * x * ((↑N) * (↑M))) i✝ j✝ = (M * (N * x * (↑N)) * (↑M)) i✝ j✝ All goals completed! 🐙
All goals completed! 🐙

The group homomorphism from SL(2, ℂ) to the Lorentz group 𝓛.

@[simps!] def toLorentzGroup : SL(2, ) →* LorentzGroup 3 where toFun M := toMatrix M, toMatrix_mem_lorentzGroup M map_one' := toMatrix 1, = 1 1, = 1 All goals completed! 🐙 map_mul' M N := M:SL(2, )N:SL(2, )toMatrix (M * N), = toMatrix M, * toMatrix N, M:SL(2, )N:SL(2, )toMatrix (M * N), = (toMatrix M, * toMatrix N, ) All goals completed! 🐙
lemma toLorentzGroup_eq_pauliBasis' (M : SL(2, )) : toLorentzGroup M = LinearMap.toMatrix PauliMatrix.pauliBasis' PauliMatrix.pauliBasis' (toSelfAdjointMap M) := M:SL(2, )(toLorentzGroup M) = (LinearMap.toMatrix PauliMatrix.pauliBasis' PauliMatrix.pauliBasis') (toSelfAdjointMap M) All goals completed! 🐙M:SL(2, )i:Fin 1 Fin 3(toSelfAdjointMap M) (PauliMatrix.pauliBasis' i) = j, (LinearMap.toMatrix PauliMatrix.pauliBasis' PauliMatrix.pauliBasis') (toSelfAdjointMap M) j i PauliMatrix.pauliBasis' j M:SL(2, )i:Fin 1 Fin 3(toSelfAdjointMap M) (PauliMatrix.pauliBasis' i) = x, (PauliMatrix.pauliBasis'.repr ((toSelfAdjointMap M) (PauliMatrix.pauliBasis' i))) x PauliMatrix.pauliBasis' x M:SL(2, )i:Fin 1 Fin 3 i_1, (PauliMatrix.pauliBasis'.repr ((toSelfAdjointMap M) (PauliMatrix.pauliBasis' i))) i_1 PauliMatrix.pauliBasis' i_1 = x, (PauliMatrix.pauliBasis'.repr ((toSelfAdjointMap M) (PauliMatrix.pauliBasis' i))) x PauliMatrix.pauliBasis' x All goals completed! 🐙M:SL(2, )i:Fin 1 Fin 3h1:(toLorentzGroup M⁻¹) = minkowskiMatrix.dual (toLorentzGroup M)j:Fin 1 Fin 3(minkowskiMatrix i i * (toLorentzGroup M) j i) PauliMatrix.pauliBasis' j = (minkowskiMatrix.dual (↑(toLorentzGroup M)) i j * minkowskiMatrix j j) PauliMatrix.pauliBasis' j M:SL(2, )i:Fin 1 Fin 3h1:(toLorentzGroup M⁻¹) = minkowskiMatrix.dual (toLorentzGroup M)j:Fin 1 Fin 3HSMul.hSMul (minkowskiMatrix i i * (toLorentzGroup M) j i) = HSMul.hSMul (minkowskiMatrix.dual (↑(toLorentzGroup M)) i j * minkowskiMatrix j j) M:SL(2, )i:Fin 1 Fin 3h1:(toLorentzGroup M⁻¹) = minkowskiMatrix.dual (toLorentzGroup M)j:Fin 1 Fin 3minkowskiMatrix i i * (toLorentzGroup M) j i = minkowskiMatrix.dual (↑(toLorentzGroup M)) i j * minkowskiMatrix j j All goals completed! 🐙

The first column of the Lorentz matrix formed from an element of SL(2, ℂ).

M:SL(2, )k:Fin 1 Fin 3 := fun μ => match μ with | Sum.inl 0 => (M 0 0 ^ 2 + M 0 1 ^ 2 + M 1 0 ^ 2 + M 1 1 ^ 2) / 2 | Sum.inr 0 => -((M 0 1).re * (M 1 1).re + (M 0 1).im * (M 1 1).im + (M 0 0).im * (M 1 0).im + (M 0 0).re * (M 1 0).re) | Sum.inr 1 => -(M 0 0).re * (M 1 0).im + (M 1 0).re * (M 0 0).im - (M 0 1).re * (M 1 1).im + (M 0 1).im * (M 1 1).re | Sum.inr 2 => (-M 0 0 ^ 2 - M 0 1 ^ 2 + M 1 0 ^ 2 + M 1 1 ^ 2) / 2h1: j, (toLorentzGroup M) j (Sum.inl 0) PauliMatrix.pauliBasis' j = μ, k μ PauliMatrix.pauliBasis' μh1x: x, ((toLorentzGroup M) x (Sum.inl 0) PauliMatrix.pauliBasis' x - k x PauliMatrix.pauliBasis' x) = 0(fun μ => (toLorentzGroup M) μ (Sum.inl 0)) = k M:SL(2, )k:Fin 1 Fin 3 := fun μ => match μ with | Sum.inl 0 => (M 0 0 ^ 2 + M 0 1 ^ 2 + M 1 0 ^ 2 + M 1 1 ^ 2) / 2 | Sum.inr 0 => -((M 0 1).re * (M 1 1).re + (M 0 1).im * (M 1 1).im + (M 0 0).im * (M 1 0).im + (M 0 0).re * (M 1 0).re) | Sum.inr 1 => -(M 0 0).re * (M 1 0).im + (M 1 0).re * (M 0 0).im - (M 0 1).re * (M 1 1).im + (M 0 1).im * (M 1 1).re | Sum.inr 2 => (-M 0 0 ^ 2 - M 0 1 ^ 2 + M 1 0 ^ 2 + M 1 1 ^ 2) / 2h1: j, (toLorentzGroup M) j (Sum.inl 0) PauliMatrix.pauliBasis' j = μ, k μ PauliMatrix.pauliBasis' μh1x: x, ((toLorentzGroup M) x (Sum.inl 0) PauliMatrix.pauliBasis' x - k x PauliMatrix.pauliBasis' x) = 0μ:Fin 1 Fin 3(toLorentzGroup M) μ (Sum.inl 0) = k μ M:SL(2, )k:Fin 1 Fin 3 := fun μ => match μ with | Sum.inl 0 => (M 0 0 ^ 2 + M 0 1 ^ 2 + M 1 0 ^ 2 + M 1 1 ^ 2) / 2 | Sum.inr 0 => -((M 0 1).re * (M 1 1).re + (M 0 1).im * (M 1 1).im + (M 0 0).im * (M 1 0).im + (M 0 0).re * (M 1 0).re) | Sum.inr 1 => -(M 0 0).re * (M 1 0).im + (M 1 0).re * (M 0 0).im - (M 0 1).re * (M 1 1).im + (M 0 1).im * (M 1 1).re | Sum.inr 2 => (-M 0 0 ^ 2 - M 0 1 ^ 2 + M 1 0 ^ 2 + M 1 1 ^ 2) / 2h1: j, (toLorentzGroup M) j (Sum.inl 0) PauliMatrix.pauliBasis' j = μ, k μ PauliMatrix.pauliBasis' μh1x: x, ((toLorentzGroup M) x (Sum.inl 0) PauliMatrix.pauliBasis' x - k x PauliMatrix.pauliBasis' x) = 0μ:Fin 1 Fin 3(toLorentzGroup M) μ (Sum.inl 0) - k μ = 0 M:SL(2, )k:Fin 1 Fin 3 := fun μ => match μ with | Sum.inl 0 => (M 0 0 ^ 2 + M 0 1 ^ 2 + M 1 0 ^ 2 + M 1 1 ^ 2) / 2 | Sum.inr 0 => -((M 0 1).re * (M 1 1).re + (M 0 1).im * (M 1 1).im + (M 0 0).im * (M 1 0).im + (M 0 0).re * (M 1 0).re) | Sum.inr 1 => -(M 0 0).re * (M 1 0).im + (M 1 0).re * (M 0 0).im - (M 0 1).re * (M 1 1).im + (M 0 1).im * (M 1 1).re | Sum.inr 2 => (-M 0 0 ^ 2 - M 0 1 ^ 2 + M 1 0 ^ 2 + M 1 1 ^ 2) / 2h1: j, (toLorentzGroup M) j (Sum.inl 0) PauliMatrix.pauliBasis' j = μ, k μ PauliMatrix.pauliBasis' μh1x: x, ((toLorentzGroup M) x (Sum.inl 0) PauliMatrix.pauliBasis' x - k x PauliMatrix.pauliBasis' x) = 0μ:Fin 1 Fin 3 i, ((toLorentzGroup M) i (Sum.inl 0) - k i) PauliMatrix.pauliBasis' i = 0 M:SL(2, )k:Fin 1 Fin 3 := fun μ => match μ with | Sum.inl 0 => (M 0 0 ^ 2 + M 0 1 ^ 2 + M 1 0 ^ 2 + M 1 1 ^ 2) / 2 | Sum.inr 0 => -((M 0 1).re * (M 1 1).re + (M 0 1).im * (M 1 1).im + (M 0 0).im * (M 1 0).im + (M 0 0).re * (M 1 0).re) | Sum.inr 1 => -(M 0 0).re * (M 1 0).im + (M 1 0).re * (M 0 0).im - (M 0 1).re * (M 1 1).im + (M 0 1).im * (M 1 1).re | Sum.inr 2 => (-M 0 0 ^ 2 - M 0 1 ^ 2 + M 1 0 ^ 2 + M 1 1 ^ 2) / 2h1: j, (toLorentzGroup M) j (Sum.inl 0) PauliMatrix.pauliBasis' j = μ, k μ PauliMatrix.pauliBasis' μh1x: x, ((toLorentzGroup M) x (Sum.inl 0) PauliMatrix.pauliBasis' x - k x PauliMatrix.pauliBasis' x) = 0μ:Fin 1 Fin 3 x, ((toLorentzGroup M) x (Sum.inl 0) PauliMatrix.pauliBasis' x - k x PauliMatrix.pauliBasis' x) = 0 All goals completed! 🐙

The first element of the image of SL(2, ℂ) in the Lorentz group.

lemma toLorentzGroup_inl_inl (M : SL(2, )) : (toLorentzGroup M).1 (Sum.inl 0) (Sum.inl 0) = ((M.1 0 0 ^ 2 + M.1 0 1 ^ 2 + M.1 1 0 ^ 2 + M.1 1 1 ^ 2) / 2) := M:SL(2, )(toLorentzGroup M) (Sum.inl 0) (Sum.inl 0) = (M 0 0 ^ 2 + M 0 1 ^ 2 + M 1 0 ^ 2 + M 1 1 ^ 2) / 2 All goals completed! 🐙

The image of SL(2, ℂ) in the Lorentz group is orthochronous.

M:SL(2, )0 (M 0 0 ^ 2 + M 0 1 ^ 2 + M 1 0 ^ 2 + M 1 1 ^ 2) / 2 All goals completed! 🐙

Homomorphism to the restricted Lorentz group

The homomorphism toLorentzGroup restricts to a homomorphism to the restricted Lorentz group. In this section we will define this homomorphism.

The determinant of the image of SL(2, ℂ) in the Lorentz group is one.

All goals completed! 🐙 calc star U.val _ = star U.val * (U.val * U.val⁻¹) := M:SL(2, )U:(unitaryGroup (Fin 2) ) := (↑M).schurTriangulationUnitaryN:ℂ²ˣ² := (↑M).schurTriangulationh:M = U * N * (star U)this:Invertible Ustar U = star U * (U * (↑U)⁻¹) All goals completed! 🐙 _ = star U.val * U.val * U.val⁻¹ := M:SL(2, )U:(unitaryGroup (Fin 2) ) := (↑M).schurTriangulationUnitaryN:ℂ²ˣ² := (↑M).schurTriangulationh:M = U * N * (star U)this:Invertible Ustar U * (U * (↑U)⁻¹) = star U * U * (↑U)⁻¹ All goals completed! 🐙 _ = U.val⁻¹ := M:SL(2, )U:(unitaryGroup (Fin 2) ) := (↑M).schurTriangulationUnitaryN:ℂ²ˣ² := (↑M).schurTriangulationh:M = U * N * (star U)this:Invertible Ustar U * U * (↑U)⁻¹ = (↑U)⁻¹ All goals completed! 🐙 _ = LinearMap.det (toSelfAdjointMap' N) := toSelfAdjointMap_similar_det U N _ = 1 := suffices N.det = 1 from toSelfAdjointMap_det_one' M.val.schurTriangulation.property this calc N.det _ = det ((U * star U).val * N) := M:SL(2, )U:(unitaryGroup (Fin 2) ) := (↑M).schurTriangulationUnitaryN:ℂ²ˣ² := (↑M).schurTriangulationh:M = U * N * (star U)this:Invertible UN.det = ((U * star U) * N).det All goals completed! 🐙 _ = det (U.val * N * star U.val) := det_mul_right_comm .. _ = M.val.det := congrArg det h.symm _ = 1 := M.property

The homomorphism from SL(2, ℂ) to the restricted Lorentz group.

@[simps!] def toRestrictedLorentzGroup : SL(2, ) →* LorentzGroup.restricted 3 := toLorentzGroup.codRestrict (LorentzGroup.restricted 3) (fun M => And.intro (toLorentzGroup_det_one M) (toLorentzGroup_isOrthochronous M))