PhysLean/HepLean/Lorentz/Group/Orthochronous.lean

196 lines
8.7 KiB
Text
Raw Normal View History

/-
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
2024-07-12 16:39:44 -04:00
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
2024-11-09 17:37:12 +00:00
import HepLean.Lorentz.RealVector.NormOne
2024-11-09 17:29:43 +00:00
import HepLean.Lorentz.Group.Proper
/-!
# The Orthochronous Lorentz Group
We define the give a series of lemmas related to the orthochronous property of lorentz
matrices.
-/
2025-01-22 10:32:39 +00:00
TODO "Prove topological properties of the Orthochronous Lorentz Group."
noncomputable section
open Matrix
open Complex
open ComplexConjugate
namespace LorentzGroup
variable {d : }
variable (Λ : LorentzGroup d)
open Lorentz.Contr
2024-07-12 11:23:02 -04:00
/-- A Lorentz transformation is `orthochronous` if its `0 0` element is non-negative. -/
def IsOrthochronous : Prop := 0 ≤ Λ.1 (Sum.inl 0) (Sum.inl 0)
2025-02-08 13:07:54 +00:00
/-- A Lorentz transformation is `orthochronous` if and only if its first column is
2024-11-26 12:29:29 +00:00
future pointing. -/
lemma IsOrthochronous_iff_futurePointing :
IsOrthochronous Λ ↔ toNormOne Λ ∈ NormOne.FuturePointing d := by
simp only [IsOrthochronous]
rw [NormOne.FuturePointing.mem_iff_inl_nonneg, toNormOne_inl]
2024-11-26 12:29:29 +00:00
/-- A Lorentz transformation is orthochronous if and only if its transpose is orthochronous. -/
lemma IsOrthochronous_iff_transpose :
2024-06-13 08:10:08 -04:00
IsOrthochronous Λ ↔ IsOrthochronous (transpose Λ) := by rfl
2024-11-26 12:29:29 +00:00
/-- A Lorentz transformation is orthochronous if and only if its `0 0` element is greater
or equal to one. -/
lemma IsOrthochronous_iff_ge_one :
IsOrthochronous Λ ↔ 1 ≤ Λ.1 (Sum.inl 0) (Sum.inl 0) := by
rw [IsOrthochronous_iff_futurePointing, NormOne.FuturePointing.mem_iff_inl_one_le_inl,
toNormOne_inl]
2024-11-26 12:29:29 +00:00
/-- A Lorentz transformation is not orthochronous if and only if its `0 0` element is less then
or equal to minus one. -/
lemma not_orthochronous_iff_le_neg_one :
¬ IsOrthochronous Λ ↔ Λ.1 (Sum.inl 0) (Sum.inl 0) ≤ -1 := by
rw [IsOrthochronous_iff_futurePointing, NormOne.FuturePointing.not_mem_iff_inl_le_neg_one,
toNormOne_inl]
2024-11-26 12:29:29 +00:00
/-- A Lorentz transformation is not orthochronous if and only if its `0 0` element is
non-positive. -/
lemma not_orthochronous_iff_le_zero : ¬ IsOrthochronous Λ ↔ Λ.1 (Sum.inl 0) (Sum.inl 0) ≤ 0 := by
rw [IsOrthochronous_iff_futurePointing, NormOne.FuturePointing.not_mem_iff_inl_le_zero,
toNormOne_inl]
2024-05-17 15:28:05 -04:00
/-- The continuous map taking a Lorentz transformation to its `0 0` element. -/
def timeCompCont : C(LorentzGroup d, ) := ⟨fun Λ => Λ.1 (Sum.inl 0) (Sum.inl 0),
2024-07-19 17:00:32 -04:00
Continuous.matrix_elem (continuous_iff_le_induced.mpr fun _ a => a) (Sum.inl 0) (Sum.inl 0)⟩
2025-02-07 15:43:59 +00:00
/-- An auxiliary function used in the definition of `orthchroMapReal`.
2024-11-26 12:29:29 +00:00
This function takes all elements of `` less then `-1` to `-1`,
2025-02-08 13:07:54 +00:00
all elements of `R` greater then `1` to `1` and preserves all other elements. -/
def stepFunction : := fun t =>
if t ≤ -1 then -1 else
if 1 ≤ t then 1 else t
2024-11-26 12:29:29 +00:00
/-- The `stepFunction` is continuous. -/
lemma stepFunction_continuous : Continuous stepFunction := by
apply Continuous.if ?_ continuous_const (Continuous.if ?_ continuous_const continuous_id)
2024-07-19 17:00:32 -04:00
<;> intro a ha
· rw [@Set.Iic_def, @frontier_Iic, @Set.mem_singleton_iff] at ha
rw [ha]
2024-09-04 07:31:34 -04:00
simp only [le_neg_self_iff, id_eq]
have h1 : ¬ (1 : ) ≤ 0 := by simp
exact Eq.symm (if_neg h1)
· rw [Set.Ici_def, @frontier_Ici, @Set.mem_singleton_iff] at ha
exact id (Eq.symm ha)
2024-05-17 15:28:05 -04:00
/-- The continuous map from `lorentzGroup` to `` wh
taking Orthochronous elements to `1` and non-orthochronous to `-1`. -/
def orthchroMapReal : C(LorentzGroup d, ) := ContinuousMap.comp
⟨stepFunction, stepFunction_continuous⟩ timeCompCont
2024-11-26 12:29:29 +00:00
/-- A Lorentz transformation which is orthochronous maps under `orthchroMapReal` to `1`. -/
lemma orthchroMapReal_on_IsOrthochronous {Λ : LorentzGroup d} (h : IsOrthochronous Λ) :
orthchroMapReal Λ = 1 := by
rw [IsOrthochronous_iff_ge_one] at h
change stepFunction (Λ.1 _ _) = 1
rw [stepFunction, if_pos h, if_neg]
linarith
2024-11-26 12:29:29 +00:00
/-- A Lorentz transformation which is not-orthochronous maps under `orthchroMapReal` to `- 1`. -/
lemma orthchroMapReal_on_not_IsOrthochronous {Λ : LorentzGroup d} (h : ¬ IsOrthochronous Λ) :
orthchroMapReal Λ = - 1 := by
rw [not_orthochronous_iff_le_neg_one] at h
2024-11-09 18:12:05 +00:00
change stepFunction _ = - 1
rw [stepFunction, if_pos]
exact h
2024-11-26 12:29:29 +00:00
/-- Every Lorentz transformation maps under `orthchroMapReal` to either `1` or `-1`. -/
lemma orthchroMapReal_minus_one_or_one (Λ : LorentzGroup d) :
orthchroMapReal Λ = -1 orthchroMapReal Λ = 1 := by
by_cases h : IsOrthochronous Λ
· exact Or.inr $ orthchroMapReal_on_IsOrthochronous h
· exact Or.inl $ orthchroMapReal_on_not_IsOrthochronous h
local notation "ℤ₂" => Multiplicative (ZMod 2)
2025-02-10 10:51:44 +00:00
/-- A continuous map from `lorentzGroup` to `ℤ₂` whose kernel are the Orthochronous elements. -/
def orthchroMap : C(LorentzGroup d, ℤ₂) :=
ContinuousMap.comp coeFor₂ {
toFun := fun Λ => ⟨orthchroMapReal Λ, orthchroMapReal_minus_one_or_one Λ⟩,
continuous_toFun := Continuous.subtype_mk (ContinuousMap.continuous orthchroMapReal) _}
2024-11-26 12:29:29 +00:00
/-- A Lorentz transformation which is orthochronous maps under `orthchroMap` to `1`
in `ℤ₂` (the identity element). -/
lemma orthchroMap_IsOrthochronous {Λ : LorentzGroup d} (h : IsOrthochronous Λ) :
orthchroMap Λ = 1 := by
simp [orthchroMap, orthchroMapReal_on_IsOrthochronous h]
2024-11-26 12:29:29 +00:00
/-- A Lorentz transformation which is not-orthochronous maps under `orthchroMap` to
the non-identity element of `ℤ₂`. -/
lemma orthchroMap_not_IsOrthochronous {Λ : LorentzGroup d} (h : ¬ IsOrthochronous Λ) :
orthchroMap Λ = Additive.toMul (1 : ZMod 2) := by
2024-09-04 06:28:46 -04:00
simp only [orthchroMap, ContinuousMap.comp_apply, ContinuousMap.coe_mk,
orthchroMapReal_on_not_IsOrthochronous h, coeFor₂_apply, Subtype.mk.injEq, Nat.reduceAdd]
rw [if_neg]
· rfl
· linarith
2025-02-07 15:43:59 +00:00
/-- The product of two orthochronous Lorentz transformations is orthochronous. -/
lemma mul_othchron_of_othchron_othchron {Λ Λ' : LorentzGroup d} (h : IsOrthochronous Λ)
(h' : IsOrthochronous Λ') : IsOrthochronous (Λ * Λ') := by
rw [IsOrthochronous_iff_transpose] at h
rw [IsOrthochronous_iff_futurePointing] at h h'
rw [IsOrthochronous, LorentzGroup.inl_inl_mul]
exact NormOne.FuturePointing.metric_reflect_mem_mem h h'
2025-02-07 15:43:59 +00:00
/-- The product of two non-orthochronous Lorentz transformations is orthochronous. -/
lemma mul_othchron_of_not_othchron_not_othchron {Λ Λ' : LorentzGroup d} (h : ¬ IsOrthochronous Λ)
(h' : ¬ IsOrthochronous Λ') : IsOrthochronous (Λ * Λ') := by
rw [IsOrthochronous_iff_transpose] at h
rw [IsOrthochronous_iff_futurePointing] at h h'
rw [IsOrthochronous, LorentzGroup.inl_inl_mul]
exact NormOne.FuturePointing.metric_reflect_not_mem_not_mem h h'
2025-02-07 15:43:59 +00:00
/-- The product of an orthochronous Lorentz transformations with a
2025-02-08 13:07:54 +00:00
non-orthochronous Lorentz transformation is not orthochronous. -/
lemma mul_not_othchron_of_othchron_not_othchron {Λ Λ' : LorentzGroup d} (h : IsOrthochronous Λ)
(h' : ¬ IsOrthochronous Λ') : ¬ IsOrthochronous (Λ * Λ') := by
rw [not_orthochronous_iff_le_zero, LorentzGroup.inl_inl_mul]
rw [IsOrthochronous_iff_transpose] at h
rw [IsOrthochronous_iff_futurePointing] at h h'
exact NormOne.FuturePointing.metric_reflect_mem_not_mem h h'
2025-02-07 15:43:59 +00:00
/-- The product of a non-orthochronous Lorentz transformations with an
2025-02-08 13:07:54 +00:00
orthochronous Lorentz transformation is not orthochronous. -/
lemma mul_not_othchron_of_not_othchron_othchron {Λ Λ' : LorentzGroup d} (h : ¬ IsOrthochronous Λ)
(h' : IsOrthochronous Λ') : ¬ IsOrthochronous (Λ * Λ') := by
rw [not_orthochronous_iff_le_zero, LorentzGroup.inl_inl_mul]
rw [IsOrthochronous_iff_transpose] at h
rw [IsOrthochronous_iff_futurePointing] at h h'
exact NormOne.FuturePointing.metric_reflect_not_mem_mem h h'
2024-07-12 16:22:06 -04:00
/-- The homomorphism from `LorentzGroup` to `ℤ₂` whose kernel are the Orthochronous elements. -/
def orthchroRep : LorentzGroup d →* ℤ₂ where
toFun := orthchroMap
2024-06-13 08:10:08 -04:00
map_one' := orthchroMap_IsOrthochronous (by simp [IsOrthochronous])
map_mul' Λ Λ' := by
2024-05-17 15:28:05 -04:00
simp only
by_cases h : IsOrthochronous Λ
2024-07-19 17:00:32 -04:00
<;> by_cases h' : IsOrthochronous Λ'
· rw [orthchroMap_IsOrthochronous h, orthchroMap_IsOrthochronous h',
orthchroMap_IsOrthochronous (mul_othchron_of_othchron_othchron h h')]
rfl
· rw [orthchroMap_IsOrthochronous h, orthchroMap_not_IsOrthochronous h',
orthchroMap_not_IsOrthochronous (mul_not_othchron_of_othchron_not_othchron h h')]
rfl
· rw [orthchroMap_not_IsOrthochronous h, orthchroMap_IsOrthochronous h',
orthchroMap_not_IsOrthochronous (mul_not_othchron_of_not_othchron_othchron h h')]
rfl
· rw [orthchroMap_not_IsOrthochronous h, orthchroMap_not_IsOrthochronous h',
orthchroMap_IsOrthochronous (mul_othchron_of_not_othchron_not_othchron h h')]
rfl
end LorentzGroup
end