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.MinkowskiMatrix public import Physlib.Meta.TODO.Basic public import Mathlib.Analysis.Complex.Basic public import Mathlib.Topology.Instances.Matrix public import Mathlib.Topology.Maps.Basic public import Mathlib.Topology.Algebra.Group.ClosedSubgroup

The Lorentz Group

We define the Lorentz group.

References

@[expose] public sectionTODO "Define the Lie group structure on the Lorentz group."

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.

Notation for the Lorentz group.

scoped[LorentzGroup] notation (name := lorentzGroup_notation) "𝓛" => LorentzGroup

Membership conditions

lemma mem_iff_self_mul_dual : Λ LorentzGroup d Λ * dual Λ = 1 := d:Λ:Matrix (Fin 1 Fin d) (Fin 1 Fin d) Λ 𝓛 d Λ * dual Λ = 1 All goals completed! 🐙d:Λ:Matrix (Fin 1 Fin d) (Fin 1 Fin d) Λ * dual Λ = 1 dual Λ * Λ = 1 All goals completed! 🐙d:Λ:Matrix (Fin 1 Fin d) (Fin 1 Fin d) h:Λ 𝓛 dh1:Λ * η * (Λ * η) = 1Λ * (η * Λ * η) = Λ * η * (Λ * η) All goals completed! 🐙d:Λ:Matrix (Fin 1 Fin d) (Fin 1 Fin d) Λ * dual Λ = 1 -Λ * dual (-Λ) = 1 All goals completed! 🐙d:Λ:Matrix (Fin 1 Fin d) (Fin 1 Fin d) Λ':Matrix (Fin 1 Fin d) (Fin 1 Fin d) :Λ 𝓛 dhΛ':Λ' 𝓛 ddual Λ' * 1 * Λ' = 1 All goals completed! 🐙d:dual 1 * 1 = 1 All goals completed! 🐙d:Λ:Matrix (Fin 1 Fin d) (Fin 1 Fin d) h:Λ 𝓛 dΛ * dual Λ = 1 All goals completed! 🐙

A matrix Λ is in the Lorentz group if and only if it satisfies Λᵀ * η * Λ = η.

All goals completed! 🐙

The Lorentz group as a group

The instance of a group on LorentzGroup d.

@[simps! mul_coe one_coe div] 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 := Subtype.ext (Matrix.mul_assoc A.1 B.1 C.1) one := 1, LorentzGroup.one_mem one_mul A := Subtype.ext (Matrix.one_mul A.1) mul_one A := Subtype.ext (Matrix.mul_one A.1) inv A := minkowskiMatrix.dual A.1, LorentzGroup.dual_mem A.2 inv_mul_cancel A := Subtype.ext (LorentzGroup.mem_iff_dual_mul_self.mp A.2)

LorentzGroup has the subtype topology.

instance : TopologicalSpace (LorentzGroup d) := instTopologicalSpaceSubtype

Lorentz group as a closed subset of matrices

lemma continuous_self_mul_dual {d : } : Continuous (fun Λ : Matrix (Fin 1 Fin d) (Fin 1 Fin d) => Λ * dual Λ) := d:Continuous fun Λ => Λ * dual Λ d:Continuous fun Λ => Λ * (η * Λ * η) All goals completed! 🐙

The Lorentz group is closed in the ambient matrix space.

d:IsClosed {Λ | Λ * dual Λ = 1} All goals completed! 🐙

The coercion from the Lorentz group to its ambient matrix space is a closed embedding.

lemma isClosedEmbedding_val {d : } : Topology.IsClosedEmbedding (Subtype.val : LorentzGroup d Matrix (Fin 1 Fin d) (Fin 1 Fin d) ) := (isClosed d).isClosedEmbedding_subtypeVal

Inverses

lemma inv_eq_dual (Λ : LorentzGroup d) : (Λ⁻¹ : LorentzGroup d) = minkowskiMatrix.dual Λ.1, LorentzGroup.dual_mem Λ.2 := d:Λ:(𝓛 d)Λ⁻¹ = dual Λ, All goals completed! 🐙lemma coe_inv : (Λ⁻¹).1 = Λ.1⁻¹:= (inv_eq_left_inv (mem_iff_dual_mul_self.mp Λ.2)).symm

The underlying matrix of a Lorentz transformation is invertible.

d:Λ:(𝓛 d)Λ':(𝓛 d)M:(𝓛 d)M * M⁻¹ = 1 All goals completed! 🐙
lemma subtype_inv_mul : (Subtype.val Λ)⁻¹ * (Subtype.val Λ) = 1 := inv_mul_of_invertible _lemma subtype_mul_inv : (Subtype.val Λ) * (Subtype.val Λ)⁻¹ = 1 := mul_inv_of_invertible _d:Λ:(𝓛 d)h2:Λ * (η * (↑Λ) * η) = 1Λ * η * (↑Λ) * η = Λ * (η * (↑Λ) * η) All goals completed! 🐙d:Λ:(𝓛 d)h2:η * (↑Λ) * η * Λ = 1η * ((↑Λ) * η * Λ) = η * (↑Λ) * η * Λ All goals completed! 🐙

Transpose of a Lorentz transformation

The transpose of a matrix in the Lorentz group is an element of the Lorentz group.

def transpose (Λ : LorentzGroup d) : LorentzGroup d := Λ.1, mem_iff_transpose.mp Λ.2
@[simp] lemma transpose_one : @transpose d 1 = 1 := Subtype.ext Matrix.transpose_one@[simp] lemma transpose_mul : transpose (Λ * Λ') = transpose Λ' * transpose Λ := Subtype.ext (Matrix.transpose_mul Λ.1 Λ'.1)lemma transpose_val : (transpose Λ).1 = Λ.1 := rflAll goals completed! 🐙d:Λ:(𝓛 d)Λ * η = Λ * η * (↑Λ) * (↑Λ)⁻¹ All goals completed! 🐙d:Λ:(𝓛 d)h1:(↑Λ)⁻¹ * (↑Λ) = 1η * Λ = 1 * η * Λ All goals completed! 🐙

Negation of a Lorentz transformation

The negation of a Lorentz transform.

instance : Neg (LorentzGroup d) where neg Λ := -Λ.1, mem_iff_neg_mem.mp Λ.2
@[simp] lemma coe_neg : (-Λ).1 = -Λ.1 := rfllemma inv_neg : (-Λ)⁻¹ = -Λ⁻¹ := d:Λ:(𝓛 d)(-Λ)⁻¹ = -Λ⁻¹ d:Λ:(𝓛 d)(-Λ)⁻¹ = (-Λ⁻¹) All goals completed! 🐙

Lorentz group as a topological group

We now show that the Lorentz group is a topological group. We do this by showing that the natural map from the Lorentz group to GL (Fin 4) ℝ is an embedding.

The homomorphism of the Lorentz group into GL (Fin 4) ℝ.

def toGL : LorentzGroup d →* GL (Fin 1 Fin d) where toFun A := A.1, (A⁻¹).1, _root_.mul_eq_one_comm.mpr $ mem_iff_dual_mul_self.mp A.2, mem_iff_dual_mul_self.mp A.2 map_one' := (GeneralLinearGroup.ext_iff _ 1).mpr fun _ => congrFun rfl map_mul' _ _ := (GeneralLinearGroup.ext_iff _ _).mpr fun _ => congrFun rfl
d:A:(𝓛 d)B:(𝓛 d)h:(toGL A) = (toGL B)A = B All goals completed! 🐙

The homomorphism from the Lorentz Group into the monoid of matrices times the opposite of the monoid of matrices.

@[simps!] 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 Λ = (Λ.1, MulOpposite.op $ minkowskiMatrix.dual Λ.1) := rfld:A:(𝓛 d)B:(𝓛 d)h:A = B MulOpposite.op (dual A) = MulOpposite.op (dual B)A = B All goals completed! 🐙lemma toProd_continuous : Continuous (@toProd d) := d:Continuous toProd All goals completed! 🐙

The embedding from the Lorentz Group into the monoid of matrices times the opposite of the monoid of matrices.

lemma toProd_embedding : IsEmbedding (@toProd d) where injective := toProd_injective eq_induced := (isInducing_iff toProd).mp (IsInducing.of_comp toProd_continuous continuous_fst ((isInducing_iff (Prod.fst toProd)).mpr rfl))

The embedding from the Lorentz Group into GL (Fin 4) ℝ.

d:x✝:Set { x // x 𝓛 d }(∃ t, IsOpen t (↑toGL).toFun ⁻¹' t = x✝) t, IsOpen t toProd ⁻¹' t = x✝ All goals completed! 🐙

The embedding of the Lorentz group into GL(n, ℝ) gives LorentzGroup d an instance of a topological group.

instance : IsTopologicalGroup (LorentzGroup d) := IsInducing.topologicalGroup toGL toGL_embedding.toIsInducing

Lorentz group as a closed subgroup of the general linear group

Following the plan sketched by PrParadoxy and Joseph Tooby-Smith in physlib issue #833, we realise LorentzGroup d as a closed subgroup of GL (Fin 1 ⊕ Fin d) ℝ. This promotes the closed embedding into the ambient matrix space (isClosedEmbedding_val) to the level of the general linear group, and is the structural prerequisite for a Lie group structure on the Lorentz group.

The remaining step of that plan, endowing LorentzGroup d with a Lie group structure as a closed subgroup of the Lie group GL (Fin 1 ⊕ Fin d) ℝ and thereby deriving its Lie algebra, needs the closed subgroup theorem (Cartan's theorem: a closed subgroup of a Lie group is an embedded Lie subgroup). That theorem is not yet available in Mathlib: there is no LieSubgroup, and no ChartedSpace/IsManifold instance is produced from a closed embedding (only IsOpenEmbedding.singletonChartedSpace, for open embeddings). The Lie group instance and the Lorentz algebra therefore remain open; see the TODO at the top of this file.

The range of toGL, as a set in GL (Fin 1 ⊕ Fin d) ℝ, is exactly the preimage of the Lorentz group under the coercion GL (Fin 1 ⊕ Fin d) ℝ → Matrix _ _ ℝ: an element of the general linear group lies in the image precisely when its underlying matrix is a Lorentz transformation.

lemma range_toGL : Set.range (@toGL d).toFun = Units.val ⁻¹' (LorentzGroup d : Set (Matrix (Fin 1 Fin d) (Fin 1 Fin d) )) := d:Set.range (↑toGL).toFun = Units.val ⁻¹' 𝓛 d d:x:GL (Fin 1 Fin d) x Set.range (↑toGL).toFun x Units.val ⁻¹' 𝓛 d d:x:GL (Fin 1 Fin d) x Set.range (↑toGL).toFun x Units.val ⁻¹' 𝓛 dd:x:GL (Fin 1 Fin d) x Units.val ⁻¹' 𝓛 d x Set.range (↑toGL).toFun d:x:GL (Fin 1 Fin d) x Set.range (↑toGL).toFun x Units.val ⁻¹' 𝓛 d d:A:(𝓛 d)(↑toGL).toFun A Units.val ⁻¹' 𝓛 d All goals completed! 🐙 d:x:GL (Fin 1 Fin d) x Units.val ⁻¹' 𝓛 d x Set.range (↑toGL).toFun d:x:GL (Fin 1 Fin d) hx:x Units.val ⁻¹' 𝓛 dx Set.range (↑toGL).toFun All goals completed! 🐙

The homomorphism toGL is a closed embedding of the Lorentz group into GL (Fin 1 ⊕ Fin d) ℝ. This strengthens toGL_embedding: the image is closed because it is the preimage, under the continuous coercion GL (Fin 1 ⊕ Fin d) ℝ → Matrix _ _ ℝ, of the closed set LorentzGroup d (LorentzGroup.isClosed).

d:IsClosed (Units.val ⁻¹' 𝓛 d) All goals completed! 🐙

The Lorentz group realised as a subgroup of GL (Fin 1 ⊕ Fin d) ℝ, namely the range of the embedding toGL.

def toGLSubgroup (d : ) : Subgroup (GL (Fin 1 Fin d) ) := (@toGL d).range
@[simp] lemma mem_toGLSubgroup {x : GL (Fin 1 Fin d) } : x toGLSubgroup d (x : Matrix (Fin 1 Fin d) (Fin 1 Fin d) ) LorentzGroup d := d:x:GL (Fin 1 Fin d) x toGLSubgroup d x 𝓛 d d:x:GL (Fin 1 Fin d) x toGLSubgroup d x 𝓛 dd:x:GL (Fin 1 Fin d) x 𝓛 d x toGLSubgroup d d:x:GL (Fin 1 Fin d) x toGLSubgroup d x 𝓛 d d:A:(𝓛 d)(toGL A) 𝓛 d All goals completed! 🐙 d:x:GL (Fin 1 Fin d) x 𝓛 d x toGLSubgroup d d:x:GL (Fin 1 Fin d) hx:x 𝓛 dx toGLSubgroup d All goals completed! 🐙lemma coe_toGLSubgroup : (toGLSubgroup d : Set (GL (Fin 1 Fin d) )) = Units.val ⁻¹' (LorentzGroup d : Set (Matrix (Fin 1 Fin d) (Fin 1 Fin d) )) := range_toGL

The Lorentz group realised as a closed subgroup of GL (Fin 1 ⊕ Fin d) ℝ. The closedness is exactly the content of toGL_isClosedEmbedding, and is the hypothesis that the (not-yet-formalised) closed subgroup theorem would consume to produce a Lie group structure.

d✝:Λ:(𝓛 d✝)Λ':(𝓛 d✝)d:IsClosed (Units.val ⁻¹' 𝓛 d) All goals completed! 🐙

To Complex matrices

The monoid homomorphisms taking the lorentz group to complex matrices.

def toComplex : LorentzGroup d →* Matrix (Fin 1 Fin d) (Fin 1 Fin d) where toFun Λ := Λ.1.map ofRealHom map_one' := d:Λ:(𝓛 d)Λ':(𝓛 d)(↑1).map ofRealHom = 1 d:Λ:(𝓛 d)Λ':(𝓛 d)i:Fin 1 Fin dj:Fin 1 Fin d(↑1).map (⇑ofRealHom) i j = 1 i j d:Λ:(𝓛 d)Λ':(𝓛 d)i:Fin 1 Fin dj:Fin 1 Fin d(1 i j) = 1 i j d:Λ:(𝓛 d)Λ':(𝓛 d)i:Fin 1 Fin dj:Fin 1 Fin d(if i = j then 1 else 0) = if i = j then 1 else 0 d:Λ:(𝓛 d)Λ':(𝓛 d)i:Fin 1 Fin dj:Fin 1 Fin dh✝:i = j1 = 1d:Λ:(𝓛 d)Λ':(𝓛 d)i:Fin 1 Fin dj:Fin 1 Fin dh✝:¬i = j0 = 0 d:Λ:(𝓛 d)Λ':(𝓛 d)i:Fin 1 Fin dj:Fin 1 Fin dh✝:i = j1 = 1 All goals completed! 🐙 d:Λ:(𝓛 d)Λ':(𝓛 d)i:Fin 1 Fin dj:Fin 1 Fin dh✝:¬i = j0 = 0 All goals completed! 🐙 map_mul' Λ Λ' := d:Λ✝:(𝓛 d)Λ'✝:(𝓛 d)Λ:(𝓛 d)Λ':(𝓛 d)(↑(Λ * Λ')).map ofRealHom = (↑Λ).map ofRealHom * (↑Λ').map ofRealHom d:Λ✝:(𝓛 d)Λ'✝:(𝓛 d)Λ:(𝓛 d)Λ':(𝓛 d)i:Fin 1 Fin dj:Fin 1 Fin d(↑(Λ * Λ')).map (⇑ofRealHom) i j = ((↑Λ).map ofRealHom * (↑Λ').map ofRealHom) i j d:Λ✝:(𝓛 d)Λ'✝:(𝓛 d)Λ:(𝓛 d)Λ':(𝓛 d)i:Fin 1 Fin dj:Fin 1 Fin d((Λ * Λ') i j) = ((↑Λ).map ofRealHom * (↑Λ').map ofRealHom) i j d:Λ✝:(𝓛 d)Λ'✝:(𝓛 d)Λ:(𝓛 d)Λ':(𝓛 d)i:Fin 1 Fin dj:Fin 1 Fin d((Λ * Λ') i j) = (Λ * Λ').map (⇑ofRealHom) i j All goals completed! 🐙

The image of a Lorentz transformation under toComplex is invertible.

d:Λ:(𝓛 d)Λ':(𝓛 d)M:(𝓛 d)toComplex 1 = 1 All goals completed! 🐙
d:Λ:(𝓛 d)toComplex 1 = 1 All goals completed! 🐙d:Λ:(𝓛 d)h1:((↑Λ).map ofRealHom) = (↑Λ).map ofRealHom(↑Λ).map ofRealHom * η.map ofRealHom * (↑Λ).map ofRealHom = η.map ofRealHom d:Λ:(𝓛 d)h1:((↑Λ).map ofRealHom) = (↑Λ).map ofRealHom(↑Λ).map ofRealHom * η.map ofRealHom * (↑Λ).map ofRealHom = (Λ * η * (↑Λ)).map ofRealHomd:Λ:(𝓛 d)h1:((↑Λ).map ofRealHom) = (↑Λ).map ofRealHom(Λ * η * (↑Λ)).map ofRealHom = η.map ofRealHom d:Λ:(𝓛 d)h1:((↑Λ).map ofRealHom) = (↑Λ).map ofRealHom(↑Λ).map ofRealHom * η.map ofRealHom * (↑Λ).map ofRealHom = (Λ * η * (↑Λ)).map ofRealHom All goals completed! 🐙 All goals completed! 🐙d:Λ:(𝓛 d)h1:((↑Λ).map ofRealHom) = (↑Λ).map ofRealHom(↑Λ).map ofRealHom * η.map ofRealHom * (↑Λ).map ofRealHom = η.map ofRealHom d:Λ:(𝓛 d)h1:((↑Λ).map ofRealHom) = (↑Λ).map ofRealHom(↑Λ).map ofRealHom * η.map ofRealHom * (↑Λ).map ofRealHom = ((↑Λ) * η * Λ).map ofRealHomd:Λ:(𝓛 d)h1:((↑Λ).map ofRealHom) = (↑Λ).map ofRealHom((↑Λ) * η * Λ).map ofRealHom = η.map ofRealHom d:Λ:(𝓛 d)h1:((↑Λ).map ofRealHom) = (↑Λ).map ofRealHom(↑Λ).map ofRealHom * η.map ofRealHom * (↑Λ).map ofRealHom = ((↑Λ) * η * Λ).map ofRealHom All goals completed! 🐙 All goals completed! 🐙d:v:Fin 1 Fin d Λ:(𝓛 d)i:Fin 1 Fin dofRealHom ((Λ *ᵥ v) i) = (ofRealHom (Λ *ᵥ v)) i All goals completed! 🐙

The parity transformation.

d:Λ:(𝓛 d)Λ':(𝓛 d)dual η * η = 1 All goals completed! 🐙

Equality conditions

lemma eq_of_mulVec_eq {Λ Λ' : LorentzGroup d} (h : (x : Fin 1 Fin d ), Λ.1 *ᵥ x = Λ'.1 *ᵥ x) : Λ = Λ' := d:Λ:(𝓛 d)Λ':(𝓛 d)h: (x : Fin 1 Fin d ), Λ *ᵥ x = Λ' *ᵥ xΛ = Λ' d:Λ:(𝓛 d)Λ':(𝓛 d)h: (x : Fin 1 Fin d ), Λ *ᵥ x = Λ' *ᵥ xΛ = Λ' All goals completed! 🐙