Imports
/-
Copyright (c) 2025 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Matteo Cipollina, Joseph Tooby-Smith
-/
module
public import Mathlib.Analysis.InnerProductSpace.PiL2
public import Mathlib.Geometry.Manifold.IsManifold.BasicLorentz Vectors
In this module we define Lorentz vectors as real Lorentz tensors with a single up index. We create an API around Lorentz vectors to make working with them as easy as possible.
@[expose] public sectionReal contravariant Lorentz vector.
def Vector (d : ℕ := 3) := Fin 1 ⊕ Fin d → ℝinstance {d} : AddCommMonoid (Vector d) :=
inferInstanceAs (AddCommMonoid (Fin 1 ⊕ Fin d → ℝ))instance {d} : Module ℝ (Vector d) :=
inferInstanceAs (Module ℝ (Fin 1 ⊕ Fin d → ℝ))instance {d} : AddCommGroup (Vector d) :=
inferInstanceAs (AddCommGroup (Fin 1 ⊕ Fin d → ℝ))instance {d} : FiniteDimensional ℝ (Vector d) :=
inferInstanceAs (FiniteDimensional ℝ (Fin 1 ⊕ Fin d → ℝ))
The equivalence between Vector d and EuclideanSpace ℝ (Fin 1 ⊕ Fin d).
def equivEuclid (d : ℕ) :
Vector d ≃ₗ[ℝ] EuclideanSpace ℝ (Fin 1 ⊕ Fin d) :=
(WithLp.linearEquiv _ _ _).symm@[simp]
lemma equivEuclid_apply (d : ℕ) (v : Vector d) (i : Fin 1 ⊕ Fin d) :
equivEuclid d v i = v i := rfl@[ext]
lemma eq_of_apply_eq {d : ℕ} {v w : Vector d} (h : ∀ i, v i = w i) : v = w := d:ℕv:Vector dw:Vector dh:∀ (i : Fin 1 ⊕ Fin d), v i = w i⊢ v = w
d:ℕv:Vector dw:Vector dh:∀ (i : Fin 1 ⊕ Fin d), v i = w i⊢ (equivEuclid d) v = (equivEuclid d) w
d:ℕv:Vector dw:Vector dh:∀ (i : Fin 1 ⊕ Fin d), v i = w ii:Fin 1 ⊕ Fin d⊢ ((equivEuclid d) v).ofLp i = ((equivEuclid d) w).ofLp i
All goals completed! 🐙instance (d : ℕ) : Norm (Vector d) where
norm := fun v => ‖equivEuclid d v‖lemma norm_eq_equivEuclid (d : ℕ) (v : Vector d) :
‖v‖ = ‖equivEuclid d v‖ := rfl@[simp]
lemma abs_component_le_norm {d : ℕ} (v : Vector d) (i : Fin 1 ⊕ Fin d) :
|v i| ≤ ‖v‖ := d:ℕv:Vector di:Fin 1 ⊕ Fin d⊢ |v i| ≤ ‖v‖
d:ℕv:Vector di:Fin 1 ⊕ Fin d⊢ |v i| ≤ √(∑ x, v x ^ 2)
d:ℕv:Vector di:Fin 1 ⊕ Fin d⊢ v i ^ 2 ≤ ∑ x, v x ^ 2
d:ℕv:Vector di:Fin 1 ⊕ Fin d⊢ v i ^ 2 ≤ ∑ j ∈ {i}, v j ^ 2d:ℕv:Vector di:Fin 1 ⊕ Fin d⊢ ∑ j ∈ {i}, v j ^ 2 ≤ ∑ x, v x ^ 2
d:ℕv:Vector di:Fin 1 ⊕ Fin d⊢ v i ^ 2 ≤ ∑ j ∈ {i}, v j ^ 2 All goals completed! 🐙
refine Finset.sum_le_univ_sum_of_nonneg (fun i => d:ℕv:Vector di✝:Fin 1 ⊕ Fin di:Fin 1 ⊕ Fin d⊢ 0 ≤ v i ^ 2 All goals completed! 🐙)All goals completed! 🐙instance isNormedSpace (d : ℕ) : NormedSpace ℝ (Vector d) where
norm_smul_le c v := by d:ℕc:ℝv:Vector d⊢ ‖c • v‖ ≤ ‖c‖ * ‖v‖
simp only [norm_eq_equivEuclid, map_smul] d:ℕc:ℝv:Vector d⊢ ‖c • (equivEuclid d) v‖ ≤ ‖c‖ * ‖(equivEuclid d) v‖
exact norm_smul_le c (equivEuclid d v) All goals completed! 🐙instance (d : ℕ) : Inner ℝ (Vector d) where
inner := fun v w => ⟪equivEuclid d v, equivEuclid d w⟫_ℝlemma inner_eq_equivEuclid (d : ℕ) (v w : Vector d) :
⟪v, w⟫_ℝ = ⟪equivEuclid d v, equivEuclid d w⟫_ℝ := rfl
The Euclidean inner product structure on CoVector.
instance innerProductSpace (d : ℕ) : InnerProductSpace ℝ (Vector d) where
norm_sq_eq_re_inner v := by d:ℕv:Vector d⊢ ‖v‖ ^ 2 = RCLike.re ⟪v, v⟫_ℝ
simp only [inner_eq_equivEuclid, norm_eq_equivEuclid] d:ℕv:Vector d⊢ ‖(equivEuclid d) v‖ ^ 2 = RCLike.re ⟪(equivEuclid d) v, (equivEuclid d) v⟫_ℝ
exact InnerProductSpace.norm_sq_eq_re_inner (equivEuclid d v) All goals completed! 🐙
conj_inner_symm x y := by d:ℕx:Vector dy:Vector d⊢ (starRingEnd ℝ) ⟪y, x⟫_ℝ = ⟪x, y⟫_ℝ
simp only [inner_eq_equivEuclid] d:ℕx:Vector dy:Vector d⊢ (starRingEnd ℝ) ⟪(equivEuclid d) y, (equivEuclid d) x⟫_ℝ = ⟪(equivEuclid d) x, (equivEuclid d) y⟫_ℝ
exact InnerProductSpace.conj_inner_symm (equivEuclid d x) (equivEuclid d y) All goals completed! 🐙
add_left x y z := by d:ℕx:Vector dy:Vector dz:Vector d⊢ ⟪x + y, z⟫_ℝ = ⟪x, z⟫_ℝ + ⟪y, z⟫_ℝ
simp only [inner_eq_equivEuclid, map_add] d:ℕx:Vector dy:Vector dz:Vector d⊢ ⟪(equivEuclid d) x + (equivEuclid d) y, (equivEuclid d) z⟫_ℝ =
⟪(equivEuclid d) x, (equivEuclid d) z⟫_ℝ + ⟪(equivEuclid d) y, (equivEuclid d) z⟫_ℝ
exact InnerProductSpace.add_left (equivEuclid d x) (equivEuclid d y) (equivEuclid d z) All goals completed! 🐙
smul_left x y r := by d:ℕx:Vector dy:Vector dr:ℝ⊢ ⟪r • x, y⟫_ℝ = (starRingEnd ℝ) r * ⟪x, y⟫_ℝ
simp only [inner_eq_equivEuclid, map_smul] d:ℕx:Vector dy:Vector dr:ℝ⊢ ⟪r • (equivEuclid d) x, (equivEuclid d) y⟫_ℝ = (starRingEnd ℝ) r * ⟪(equivEuclid d) x, (equivEuclid d) y⟫_ℝ
exact InnerProductSpace.smul_left (equivEuclid d x) (equivEuclid d y) r All goals completed! 🐙
The instance of a ChartedSpace on Vector d.
instance {d} : CoeFun (Vector d) (fun _ => Fin 1 ⊕ Fin d → ℝ) where
coe := fun v => vlemma ext_of_apply {d} {v w : Vector d} (h : ∀ i, v i = w i) : v = w := by d:ℕv:Vector dw:Vector dh:∀ (i : Fin 1 ⊕ Fin d), v i = w i⊢ v = w
apply (equivEuclid d).injective d:ℕv:Vector dw:Vector dh:∀ (i : Fin 1 ⊕ Fin d), v i = w i⊢ (equivEuclid d) v = (equivEuclid d) w
ext i d:ℕv:Vector dw:Vector dh:∀ (i : Fin 1 ⊕ Fin d), v i = w ii:Fin 1 ⊕ Fin d⊢ ((equivEuclid d) v).ofLp i = ((equivEuclid d) w).ofLp i
simpa using h i All goals completed! 🐙@[simp]
lemma apply_smul {d : ℕ} (c : ℝ) (v : Vector d) (i : Fin 1 ⊕ Fin d) :
(c • v) i = c * v i := rfl@[simp]
lemma apply_add {d : ℕ} (v w : Vector d) (i : Fin 1 ⊕ Fin d) :
(v + w) i = v i + w i := rfl@[simp]
lemma apply_sub {d : ℕ} (v w : Vector d) (i : Fin 1 ⊕ Fin d) :
(v - w) i = v i - w i := by d:ℕv:Vector dw:Vector di:Fin 1 ⊕ Fin d⊢ (v - w) i = v i - w i rfl All goals completed! 🐙
lemma apply_sum {d : ℕ} {ι : Type} [Fintype ι] (f : ι → Vector d) (i : Fin 1 ⊕ Fin d) :
(∑ j, f j) i = ∑ j, f j i := by d:ℕι:Typeinst✝:Fintype ιf:ι → Vector di:Fin 1 ⊕ Fin d⊢ (∑ j, f j) i = ∑ j, f j i
let P (ι : Type) [Fintype ι] := ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d),
(∑ j : ι, f j) i = ∑ j, f j i d:ℕι:Typeinst✝:Fintype ιf:ι → Vector di:Fin 1 ⊕ Fin dP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j i⊢ (∑ j, f j) i = ∑ j, f j i
revert i f d:ℕι:Typeinst✝:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j i⊢ ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j i
change P ι d:ℕι:Typeinst✝:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j i⊢ P ι
apply Fintype.induction_empty_option of_equiv d:ℕι:Typeinst✝:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j i⊢ ∀ (α β : Type) [inst : Fintype β] (e : α ≃ β), P α → P βh_empty d:ℕι:Typeinst✝:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j i⊢ P PEmpty.{1}h_option d:ℕι:Typeinst✝:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j i⊢ ∀ (α : Type) [inst : Fintype α], P α → P (Option α)
· of_equiv d:ℕι:Typeinst✝:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j i⊢ ∀ (α β : Type) [inst : Fintype β] (e : α ≃ β), P α → P β intro ι1 ι2 _ e h1 of_equiv d:ℕι:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι1:Typeι2:Typeinst✝:Fintype ι2e:ι1 ≃ ι2h1:P ι1⊢ P ι2
dsimp [P] of_equiv d:ℕι:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι1:Typeι2:Typeinst✝:Fintype ι2e:ι1 ≃ ι2h1:P ι1⊢ ∀ (f : ι2 → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j i
intro f i of_equiv d:ℕι:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι1:Typeι2:Typeinst✝:Fintype ι2e:ι1 ≃ ι2h1:P ι1f:ι2 → Vector di:Fin 1 ⊕ Fin d⊢ (∑ j, f j) i = ∑ j, f j i
have h' := h1 (f ∘ e) i of_equiv d:ℕι:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι1:Typeι2:Typeinst✝:Fintype ι2e:ι1 ≃ ι2h1:P ι1f:ι2 → Vector di:Fin 1 ⊕ Fin dh':(∑ j, (f ∘ ⇑e) j) i = ∑ j, (f ∘ ⇑e) j i⊢ (∑ j, f j) i = ∑ j, f j i
simp at h' of_equiv d:ℕι:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι1:Typeι2:Typeinst✝:Fintype ι2e:ι1 ≃ ι2h1:P ι1f:ι2 → Vector di:Fin 1 ⊕ Fin dh':(∑ x, f (e x)) i = ∑ x, f (e x) i⊢ (∑ j, f j) i = ∑ j, f j i
rw [← @e.sum_comp, of_equiv d:ℕι:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι1:Typeι2:Typeinst✝:Fintype ι2e:ι1 ≃ ι2h1:P ι1f:ι2 → Vector di:Fin 1 ⊕ Fin dh':(∑ x, f (e x)) i = ∑ x, f (e x) i⊢ (∑ i, f (e i)) i = ∑ j, f j iof_equiv.inst d:ℕι:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι1:Typeι2:Typeinst✝:Fintype ι2e:ι1 ≃ ι2h1:P ι1f:ι2 → Vector di:Fin 1 ⊕ Fin dh':(∑ x, f (e x)) i = ∑ x, f (e x) i⊢ Fintype ι1 All goals completed! 🐙 ← @e.sum_comp, of_equiv d:ℕι:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι1:Typeι2:Typeinst✝:Fintype ι2e:ι1 ≃ ι2h1:P ι1f:ι2 → Vector di:Fin 1 ⊕ Fin dh':(∑ x, f (e x)) i = ∑ x, f (e x) i⊢ (∑ i, f (e i)) i = ∑ i_1, f (e i_1) iof_equiv.inst d:ℕι:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι1:Typeι2:Typeinst✝:Fintype ι2e:ι1 ≃ ι2h1:P ι1f:ι2 → Vector di:Fin 1 ⊕ Fin dh':(∑ x, f (e x)) i = ∑ x, f (e x) i⊢ Fintype ι1of_equiv.inst d:ℕι:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι1:Typeι2:Typeinst✝:Fintype ι2e:ι1 ≃ ι2h1:P ι1f:ι2 → Vector di:Fin 1 ⊕ Fin dh':(∑ x, f (e x)) i = ∑ x, f (e x) i⊢ Fintype ι1 All goals completed! 🐙 h' of_equiv d:ℕι:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι1:Typeι2:Typeinst✝:Fintype ι2e:ι1 ≃ ι2h1:P ι1f:ι2 → Vector di:Fin 1 ⊕ Fin dh':(∑ x, f (e x)) i = ∑ x, f (e x) i⊢ ∑ x, f (e x) i = ∑ i_1, f (e i_1) iof_equiv.inst d:ℕι:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι1:Typeι2:Typeinst✝:Fintype ι2e:ι1 ≃ ι2h1:P ι1f:ι2 → Vector di:Fin 1 ⊕ Fin dh':(∑ x, f (e x)) i = ∑ x, f (e x) i⊢ Fintype ι1 All goals completed! 🐙] All goals completed! 🐙
· h_empty d:ℕι:Typeinst✝:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j i⊢ P PEmpty.{1} intro f i h_empty d:ℕι:Typeinst✝:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j if:PEmpty.{1} → Vector di:Fin 1 ⊕ Fin d⊢ (∑ j, f j) i = ∑ j, f j i
simp only [Finset.univ_eq_empty, Finset.sum_empty] h_empty d:ℕι:Typeinst✝:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j if:PEmpty.{1} → Vector di:Fin 1 ⊕ Fin d⊢ 0 i = 0
rfl All goals completed! 🐙
· h_option d:ℕι:Typeinst✝:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j i⊢ ∀ (α : Type) [inst : Fintype α], P α → P (Option α) intro ι _ h f i h_option d:ℕι✝:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι:Typeinst✝:Fintype ιh:P ιf:Option ι → Vector di:Fin 1 ⊕ Fin d⊢ (∑ j, f j) i = ∑ j, f j i
rw [Fintype.sum_option, h_option d:ℕι✝:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι:Typeinst✝:Fintype ιh:P ιf:Option ι → Vector di:Fin 1 ⊕ Fin d⊢ (f none + ∑ i, f (some i)) i = ∑ j, f j i All goals completed! 🐙 apply_add, h_option d:ℕι✝:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι:Typeinst✝:Fintype ιh:P ιf:Option ι → Vector di:Fin 1 ⊕ Fin d⊢ f none i + (∑ i, f (some i)) i = ∑ j, f j i All goals completed! 🐙 h, h_option d:ℕι✝:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι:Typeinst✝:Fintype ιh:P ιf:Option ι → Vector di:Fin 1 ⊕ Fin d⊢ f none i + ∑ j, f (some j) i = ∑ j, f j i All goals completed! 🐙 Fintype.sum_option h_option d:ℕι✝:Typeinst✝¹:Fintype ιP:(ι : Type) → [Fintype ι] → Prop := fun ι [Fintype ι] => ∀ (f : ι → Vector d) (i : Fin 1 ⊕ Fin d), (∑ j, f j) i = ∑ j, f j iι:Typeinst✝:Fintype ιh:P ιf:Option ι → Vector di:Fin 1 ⊕ Fin d⊢ f none i + ∑ j, f (some j) i = f none i + ∑ i_1, f (some i_1) i All goals completed! 🐙] All goals completed! 🐙@[simp]
lemma neg_apply {d : ℕ} (v : Vector d) (i : Fin 1 ⊕ Fin d) :
(-v) i = - v i := rfl@[simp]
lemma zero_apply {d : ℕ} (i : Fin 1 ⊕ Fin d) :
(0 : Vector d) i = 0 := rflThe continuous linear map from a Lorentz vector to one of its coordinates.
def coordCLM {d : ℕ} (i : Fin 1 ⊕ Fin d) : Vector d →L[ℝ] ℝ := LinearMap.toContinuousLinearMap {
toFun v := v i
map_add' := by d:ℕi:Fin 1 ⊕ Fin d⊢ ∀ (x y : Vector d), (x + y) i = x i + y i simp All goals completed! 🐙
map_smul' := by d:ℕi:Fin 1 ⊕ Fin d⊢ ∀ (m : ℝ) (x : Vector d), (m • x) i = (RingHom.id ℝ) m • x i simp All goals completed! 🐙}lemma coordCLM_apply {d : ℕ} (i : Fin 1 ⊕ Fin d) (v : Vector d) :
coordCLM i v = v i := rfl@[fun_prop]
lemma coord_continuous {d : ℕ} (i : Fin 1 ⊕ Fin d) :
Continuous (fun v : Vector d => v i) :=
(coordCLM i).continuous@[fun_prop]
lemma coord_contDiff {n} {d : ℕ} (i : Fin 1 ⊕ Fin d) :
ContDiff ℝ n (fun v : Vector d => v i) :=
(coordCLM i).contDiff@[fun_prop]
lemma coord_differentiable {d : ℕ} (i : Fin 1 ⊕ Fin d) :
Differentiable ℝ (fun v : Vector d => v i) :=
(coordCLM i).differentiable@[fun_prop]
lemma coord_differentiableAt {d : ℕ} (i : Fin 1 ⊕ Fin d) (v : Vector d) :
DifferentiableAt ℝ (fun v : Vector d => v i) v :=
(coordCLM i).differentiableAt
The continuous linear equivalence between Vector d and Euclidean space.
def euclidCLE (d : ℕ) : Vector d ≃L[ℝ] EuclideanSpace ℝ (Fin 1 ⊕ Fin d) :=
LinearEquiv.toContinuousLinearEquiv (equivEuclid d)
The continuous linear equivalence between Vector d and the corresponding Pi type.
def equivPi (d : ℕ) :
Vector d ≃L[ℝ] Π (_ : Fin 1 ⊕ Fin d), ℝ :=
LinearEquiv.toContinuousLinearEquiv (LinearEquiv.refl _ _)@[simp]
lemma equivPi_apply {d : ℕ} (v : Vector d) (i : Fin 1 ⊕ Fin d) :
equivPi d v i = v i := rfl
@[fun_prop]
lemma continuous_of_apply {d : ℕ} {α : Type*} [TopologicalSpace α]
(f : α → Vector d)
(h : ∀ i : Fin 1 ⊕ Fin d, Continuous (fun x => f x i)) :
Continuous f := by d:ℕα:Type u_1inst✝:TopologicalSpace αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), Continuous fun x => f x i⊢ Continuous f
rw [← (equivPi d).comp_continuous_iff d:ℕα:Type u_1inst✝:TopologicalSpace αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), Continuous fun x => f x i⊢ Continuous (⇑(equivPi d) ∘ f) d:ℕα:Type u_1inst✝:TopologicalSpace αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), Continuous fun x => f x i⊢ Continuous (⇑(equivPi d) ∘ f)] d:ℕα:Type u_1inst✝:TopologicalSpace αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), Continuous fun x => f x i⊢ Continuous (⇑(equivPi d) ∘ f)
apply continuous_pi d:ℕα:Type u_1inst✝:TopologicalSpace αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), Continuous fun x => f x i⊢ ∀ (i : Fin 1 ⊕ Fin d), Continuous fun a => (⇑(equivPi d) ∘ f) a i
intro i d:ℕα:Type u_1inst✝:TopologicalSpace αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), Continuous fun x => f x ii:Fin 1 ⊕ Fin d⊢ Continuous fun a => (⇑(equivPi d) ∘ f) a i
simp only [Function.comp_apply, equivPi_apply] d:ℕα:Type u_1inst✝:TopologicalSpace αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), Continuous fun x => f x ii:Fin 1 ⊕ Fin d⊢ Continuous fun a => f a i
fun_prop All goals completed! 🐙
lemma differentiable_apply {d : ℕ} {α : Type*} [NormedAddCommGroup α] [NormedSpace ℝ α]
(f : α → Vector d) :
(∀ i : Fin 1 ⊕ Fin d, Differentiable ℝ (fun x => f x i)) ↔ Differentiable ℝ f := by d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector d⊢ (∀ (i : Fin 1 ⊕ Fin d), Differentiable ℝ fun x => f x i) ↔ Differentiable ℝ f
apply Iff.intro mp d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector d⊢ (∀ (i : Fin 1 ⊕ Fin d), Differentiable ℝ fun x => f x i) → Differentiable ℝ fmpr d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector d⊢ Differentiable ℝ f → ∀ (i : Fin 1 ⊕ Fin d), Differentiable ℝ fun x => f x i
· mp d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector d⊢ (∀ (i : Fin 1 ⊕ Fin d), Differentiable ℝ fun x => f x i) → Differentiable ℝ f intro h mp d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), Differentiable ℝ fun x => f x i⊢ Differentiable ℝ f
rw [← (Lorentz.Vector.equivPi d).comp_differentiable_iff mp d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), Differentiable ℝ fun x => f x i⊢ Differentiable ℝ (⇑(equivPi d) ∘ f) mp d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), Differentiable ℝ fun x => f x i⊢ Differentiable ℝ (⇑(equivPi d) ∘ f)] mp d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), Differentiable ℝ fun x => f x i⊢ Differentiable ℝ (⇑(equivPi d) ∘ f)
exact differentiable_pi'' h All goals completed! 🐙
· mpr d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector d⊢ Differentiable ℝ f → ∀ (i : Fin 1 ⊕ Fin d), Differentiable ℝ fun x => f x i intro h ν mpr d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fν:Fin 1 ⊕ Fin d⊢ Differentiable ℝ fun x => f x ν
change Differentiable ℝ (Lorentz.Vector.coordCLM ν ∘ f) mpr d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fν:Fin 1 ⊕ Fin d⊢ Differentiable ℝ (⇑(coordCLM ν) ∘ f)
apply Differentiable.comp mpr.hg d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fν:Fin 1 ⊕ Fin d⊢ Differentiable ℝ ⇑(coordCLM ν)hf d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fν:Fin 1 ⊕ Fin d⊢ Differentiable ℝ f
· mpr.hg d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fν:Fin 1 ⊕ Fin d⊢ Differentiable ℝ ⇑(coordCLM ν) fun_prop All goals completed! 🐙
· hf d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fν:Fin 1 ⊕ Fin d⊢ Differentiable ℝ f exact h All goals completed! 🐙
lemma contDiff_apply {n : WithTop ℕ∞} {d : ℕ} {α : Type*}
[NormedAddCommGroup α] [NormedSpace ℝ α]
(f : α → Vector d) :
(∀ i : Fin 1 ⊕ Fin d, ContDiff ℝ n (fun x => f x i)) ↔ ContDiff ℝ n f := by n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector d⊢ (∀ (i : Fin 1 ⊕ Fin d), ContDiff ℝ n fun x => f x i) ↔ ContDiff ℝ n f
apply Iff.intro mp n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector d⊢ (∀ (i : Fin 1 ⊕ Fin d), ContDiff ℝ n fun x => f x i) → ContDiff ℝ n fmpr n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector d⊢ ContDiff ℝ n f → ∀ (i : Fin 1 ⊕ Fin d), ContDiff ℝ n fun x => f x i
· mp n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector d⊢ (∀ (i : Fin 1 ⊕ Fin d), ContDiff ℝ n fun x => f x i) → ContDiff ℝ n f intro h mp n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), ContDiff ℝ n fun x => f x i⊢ ContDiff ℝ n f
rw [← (Lorentz.Vector.equivPi d).comp_contDiff_iff mp n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), ContDiff ℝ n fun x => f x i⊢ ContDiff ℝ n (⇑(equivPi d) ∘ f) mp n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), ContDiff ℝ n fun x => f x i⊢ ContDiff ℝ n (⇑(equivPi d) ∘ f)] mp n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), ContDiff ℝ n fun x => f x i⊢ ContDiff ℝ n (⇑(equivPi d) ∘ f)
apply contDiff_pi' mp n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), ContDiff ℝ n fun x => f x i⊢ ∀ (i : Fin 1 ⊕ Fin d), ContDiff ℝ n fun x => (⇑(equivPi d) ∘ f) x i
intro ν mp n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:∀ (i : Fin 1 ⊕ Fin d), ContDiff ℝ n fun x => f x iν:Fin 1 ⊕ Fin d⊢ ContDiff ℝ n fun x => (⇑(equivPi d) ∘ f) x ν
exact h ν All goals completed! 🐙
· mpr n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector d⊢ ContDiff ℝ n f → ∀ (i : Fin 1 ⊕ Fin d), ContDiff ℝ n fun x => f x i intro h ν mpr n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:ContDiff ℝ n fν:Fin 1 ⊕ Fin d⊢ ContDiff ℝ n fun x => f x ν
change ContDiff ℝ n (Lorentz.Vector.coordCLM ν ∘ f) mpr n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:ContDiff ℝ n fν:Fin 1 ⊕ Fin d⊢ ContDiff ℝ n (⇑(coordCLM ν) ∘ f)
apply ContDiff.comp mpr.hg n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:ContDiff ℝ n fν:Fin 1 ⊕ Fin d⊢ ContDiff ℝ n ⇑(coordCLM ν)mpr.hf n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:ContDiff ℝ n fν:Fin 1 ⊕ Fin d⊢ ContDiff ℝ n f
· mpr.hg n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:ContDiff ℝ n fν:Fin 1 ⊕ Fin d⊢ ContDiff ℝ n ⇑(coordCLM ν) fun_prop All goals completed! 🐙
· mpr.hf n:WithTop ℕ∞d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:ContDiff ℝ n fν:Fin 1 ⊕ Fin d⊢ ContDiff ℝ n f exact h All goals completed! 🐙
lemma fderiv_apply {d : ℕ} {α : Type*}
[NormedAddCommGroup α] [NormedSpace ℝ α]
(f : α → Vector d) (h : Differentiable ℝ f)
(x : α) (dt : α) (ν : Fin 1 ⊕ Fin d) :
fderiv ℝ f x dt ν = fderiv ℝ (fun y => f y ν) x dt := by d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fx:αdt:αν:Fin 1 ⊕ Fin d⊢ (fderiv ℝ f x) dt ν = (fderiv ℝ (fun y => f y ν) x) dt
change _ = (fderiv ℝ (Lorentz.Vector.coordCLM ν ∘ f) x) dt d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fx:αdt:αν:Fin 1 ⊕ Fin d⊢ (fderiv ℝ f x) dt ν = (fderiv ℝ (⇑(coordCLM ν) ∘ f) x) dt
rw [fderiv_comp _ (by d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fx:αdt:αν:Fin 1 ⊕ Fin d⊢ DifferentiableAt ℝ (⇑(coordCLM ν)) (f x) d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fx:αdt:αν:Fin 1 ⊕ Fin d⊢ (fderiv ℝ f x) dt ν = (fderiv ℝ (⇑(coordCLM ν)) (f x) ∘SL fderiv ℝ f x) dt fun_prop All goals completed! 🐙 d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fx:αdt:αν:Fin 1 ⊕ Fin d⊢ (fderiv ℝ f x) dt ν = (fderiv ℝ (⇑(coordCLM ν)) (f x) ∘SL fderiv ℝ f x) dt) (by d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fx:αdt:αν:Fin 1 ⊕ Fin d⊢ DifferentiableAt ℝ f x d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fx:αdt:αν:Fin 1 ⊕ Fin d⊢ (fderiv ℝ f x) dt ν = (fderiv ℝ (⇑(coordCLM ν)) (f x) ∘SL fderiv ℝ f x) dt fun_prop All goals completed! 🐙 d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fx:αdt:αν:Fin 1 ⊕ Fin d⊢ (fderiv ℝ f x) dt ν = (fderiv ℝ (⇑(coordCLM ν)) (f x) ∘SL fderiv ℝ f x) dt)] d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fx:αdt:αν:Fin 1 ⊕ Fin d⊢ (fderiv ℝ f x) dt ν = (fderiv ℝ (⇑(coordCLM ν)) (f x) ∘SL fderiv ℝ f x) dt
simp only [ContinuousLinearMap.fderiv, ContinuousLinearMap.coe_comp, Function.comp_apply] d:ℕα:Type u_1inst✝¹:NormedAddCommGroup αinst✝:NormedSpace ℝ αf:α → Vector dh:Differentiable ℝ fx:αdt:αν:Fin 1 ⊕ Fin d⊢ (fderiv ℝ f x) dt ν = (coordCLM ν) ((fderiv ℝ f x) dt)
rfl All goals completed! 🐙@[simp]
lemma fderiv_coord {d : ℕ} (μ : Fin 1 ⊕ Fin d) (x : Vector d) :
fderiv ℝ (fun v : Vector d => v μ) x = coordCLM μ := by d:ℕμ:Fin 1 ⊕ Fin dx:Vector d⊢ fderiv ℝ (fun v => v μ) x = coordCLM μ
change fderiv ℝ (coordCLM μ) x = coordCLM μ d:ℕμ:Fin 1 ⊕ Fin dx:Vector d⊢ fderiv ℝ (⇑(coordCLM μ)) x = coordCLM μ
simp All goals completed! 🐙Basis
The basis on Vector d indexed by Fin 1 ⊕ Fin d.
def basis {d : ℕ} : Basis (Fin 1 ⊕ Fin d) ℝ (Vector d) :=
Pi.basisFun ℝ _@[simp]
lemma basis_apply {d : ℕ} (μ ν : Fin 1 ⊕ Fin d) :
basis μ ν = if μ = ν then 1 else 0 := by d:ℕμ:Fin 1 ⊕ Fin dν:Fin 1 ⊕ Fin d⊢ basis μ ν = if μ = ν then 1 else 0
simp [basis] d:ℕμ:Fin 1 ⊕ Fin dν:Fin 1 ⊕ Fin d⊢ (Pi.basisFun ℝ (Fin 1 ⊕ Fin d)) μ ν = if μ = ν then 1 else 0
erw [Pi.basisFun_apply, d:ℕμ:Fin 1 ⊕ Fin dν:Fin 1 ⊕ Fin d⊢ Pi.single μ 1 ν = if μ = ν then 1 else 0 Pi.single_apply d:ℕμ:Fin 1 ⊕ Fin dν:Fin 1 ⊕ Fin d⊢ (if ν = μ then 1 else 0) = if μ = ν then 1 else 0] d:ℕμ:Fin 1 ⊕ Fin dν:Fin 1 ⊕ Fin d⊢ (if ν = μ then 1 else 0) = if μ = ν then 1 else 0
congr 1 e_c d:ℕμ:Fin 1 ⊕ Fin dν:Fin 1 ⊕ Fin d⊢ (ν = μ) = (μ = ν)
exact Lean.Grind.eq_congr' rfl rfl All goals completed! 🐙lemma basis_repr_apply {d : ℕ} (p : Vector d) (μ : Fin 1 ⊕ Fin d) :
basis.repr p μ = p μ := by d:ℕp:Vector dμ:Fin 1 ⊕ Fin d⊢ (basis.repr p) μ = p μ
simp [basis] d:ℕp:Vector dμ:Fin 1 ⊕ Fin d⊢ ((Pi.basisFun ℝ (Fin 1 ⊕ Fin d)).repr p) μ = p μ
erw [Pi.basisFun_repr d:ℕp:Vector dμ:Fin 1 ⊕ Fin d⊢ p μ = p μ] All goals completed! 🐙lemma map_apply_eq_basis_mulVec {d : ℕ} (f : Vector d →ₗ[ℝ] Vector d) (p : Vector d) :
(f p) = (LinearMap.toMatrix basis basis) f *ᵥ p := by d:ℕf:Vector d →ₗ[ℝ] Vector dp:Vector d⊢ f p = (LinearMap.toMatrix basis basis) f *ᵥ p
exact Eq.symm (LinearMap.toMatrix_mulVec_repr basis basis f p) All goals completed! 🐙lemma sum_basis_eq_zero_iff {d : ℕ} (f : Fin 1 ⊕ Fin d → ℝ) :
(∑ μ, f μ • basis μ) = 0 ↔ ∀ μ, f μ = 0 := by d:ℕf:Fin 1 ⊕ Fin d → ℝ⊢ ∑ μ, f μ • basis μ = 0 ↔ ∀ (μ : Fin 1 ⊕ Fin d), f μ = 0
apply Iff.intro mp d:ℕf:Fin 1 ⊕ Fin d → ℝ⊢ ∑ μ, f μ • basis μ = 0 → ∀ (μ : Fin 1 ⊕ Fin d), f μ = 0mpr d:ℕf:Fin 1 ⊕ Fin d → ℝ⊢ (∀ (μ : Fin 1 ⊕ Fin d), f μ = 0) → ∑ μ, f μ • basis μ = 0
· mp d:ℕf:Fin 1 ⊕ Fin d → ℝ⊢ ∑ μ, f μ • basis μ = 0 → ∀ (μ : Fin 1 ⊕ Fin d), f μ = 0 intro h mp d:ℕf:Fin 1 ⊕ Fin d → ℝh:∑ μ, f μ • basis μ = 0⊢ ∀ (μ : Fin 1 ⊕ Fin d), f μ = 0
have h1 := (linearIndependent_iff').mp basis.linearIndependent Finset.univ f h mp d:ℕf:Fin 1 ⊕ Fin d → ℝh:∑ μ, f μ • basis μ = 0h1:∀ i ∈ Finset.univ, f i = 0⊢ ∀ (μ : Fin 1 ⊕ Fin d), f μ = 0
intro μ mp d:ℕf:Fin 1 ⊕ Fin d → ℝh:∑ μ, f μ • basis μ = 0h1:∀ i ∈ Finset.univ, f i = 0μ:Fin 1 ⊕ Fin d⊢ f μ = 0
exact h1 μ (by d:ℕf:Fin 1 ⊕ Fin d → ℝh:∑ μ, f μ • basis μ = 0h1:∀ i ∈ Finset.univ, f i = 0μ:Fin 1 ⊕ Fin d⊢ μ ∈ Finset.univ simp All goals completed! 🐙)
· mpr d:ℕf:Fin 1 ⊕ Fin d → ℝ⊢ (∀ (μ : Fin 1 ⊕ Fin d), f μ = 0) → ∑ μ, f μ • basis μ = 0 intro h mpr d:ℕf:Fin 1 ⊕ Fin d → ℝh:∀ (μ : Fin 1 ⊕ Fin d), f μ = 0⊢ ∑ μ, f μ • basis μ = 0
simp [h] All goals completed! 🐙
lemma sum_inl_inr_basis_eq_zero_iff {d : ℕ} (f₀ : ℝ) (f : Fin d → ℝ) :
f₀ • basis (Sum.inl 0) + (∑ i, f i • basis (Sum.inr i)) = 0 ↔
f₀ = 0 ∧ ∀ i, f i = 0 := by d:ℕf₀:ℝf:Fin d → ℝ⊢ f₀ • basis (Sum.inl 0) + ∑ i, f i • basis (Sum.inr i) = 0 ↔ f₀ = 0 ∧ ∀ (i : Fin d), f i = 0
let f' : Fin 1 ⊕ Fin d → ℝ := fun μ =>
match μ with
| Sum.inl 0 => f₀
| Sum.inr i => f i d:ℕf₀:ℝf:Fin d → ℝf':Fin 1 ⊕ Fin d → ℝ :=
fun μ =>
match μ with
| Sum.inl 0 => f₀
| Sum.inr i => f i⊢ f₀ • basis (Sum.inl 0) + ∑ i, f i • basis (Sum.inr i) = 0 ↔ f₀ = 0 ∧ ∀ (i : Fin d), f i = 0
have h1 : f₀ • basis (Sum.inl 0) + (∑ i, f i • basis (Sum.inr i))
= ∑ μ, f' μ • basis μ := by simp [f'] d:ℕf₀:ℝf:Fin d → ℝf':Fin 1 ⊕ Fin d → ℝ :=
fun μ =>
match μ with
| Sum.inl 0 => f₀
| Sum.inr i => f ih1:f₀ • basis (Sum.inl 0) + ∑ i, f i • basis (Sum.inr i) = ∑ μ, f' μ • basis μ⊢ f₀ • basis (Sum.inl 0) + ∑ i, f i • basis (Sum.inr i) = 0 ↔ f₀ = 0 ∧ ∀ (i : Fin d), f i = 0 d:ℕf₀:ℝf:Fin d → ℝf':Fin 1 ⊕ Fin d → ℝ :=
fun μ =>
match μ with
| Sum.inl 0 => f₀
| Sum.inr i => f ih1:f₀ • basis (Sum.inl 0) + ∑ i, f i • basis (Sum.inr i) = ∑ μ, f' μ • basis μ⊢ f₀ • basis (Sum.inl 0) + ∑ i, f i • basis (Sum.inr i) = 0 ↔ f₀ = 0 ∧ ∀ (i : Fin d), f i = 0
rw [h1, d:ℕf₀:ℝf:Fin d → ℝf':Fin 1 ⊕ Fin d → ℝ :=
fun μ =>
match μ with
| Sum.inl 0 => f₀
| Sum.inr i => f ih1:f₀ • basis (Sum.inl 0) + ∑ i, f i • basis (Sum.inr i) = ∑ μ, f' μ • basis μ⊢ ∑ μ, f' μ • basis μ = 0 ↔ f₀ = 0 ∧ ∀ (i : Fin d), f i = 0 d:ℕf₀:ℝf:Fin d → ℝf':Fin 1 ⊕ Fin d → ℝ :=
fun μ =>
match μ with
| Sum.inl 0 => f₀
| Sum.inr i => f ih1:f₀ • basis (Sum.inl 0) + ∑ i, f i • basis (Sum.inr i) = ∑ μ, f' μ • basis μ⊢ (∀ (μ : Fin 1 ⊕ Fin d), f' μ = 0) ↔ f₀ = 0 ∧ ∀ (i : Fin d), f i = 0 sum_basis_eq_zero_iff d:ℕf₀:ℝf:Fin d → ℝf':Fin 1 ⊕ Fin d → ℝ :=
fun μ =>
match μ with
| Sum.inl 0 => f₀
| Sum.inr i => f ih1:f₀ • basis (Sum.inl 0) + ∑ i, f i • basis (Sum.inr i) = ∑ μ, f' μ • basis μ⊢ (∀ (μ : Fin 1 ⊕ Fin d), f' μ = 0) ↔ f₀ = 0 ∧ ∀ (i : Fin d), f i = 0 d:ℕf₀:ℝf:Fin d → ℝf':Fin 1 ⊕ Fin d → ℝ :=
fun μ =>
match μ with
| Sum.inl 0 => f₀
| Sum.inr i => f ih1:f₀ • basis (Sum.inl 0) + ∑ i, f i • basis (Sum.inr i) = ∑ μ, f' μ • basis μ⊢ (∀ (μ : Fin 1 ⊕ Fin d), f' μ = 0) ↔ f₀ = 0 ∧ ∀ (i : Fin d), f i = 0] d:ℕf₀:ℝf:Fin d → ℝf':Fin 1 ⊕ Fin d → ℝ :=
fun μ =>
match μ with
| Sum.inl 0 => f₀
| Sum.inr i => f ih1:f₀ • basis (Sum.inl 0) + ∑ i, f i • basis (Sum.inr i) = ∑ μ, f' μ • basis μ⊢ (∀ (μ : Fin 1 ⊕ Fin d), f' μ = 0) ↔ f₀ = 0 ∧ ∀ (i : Fin d), f i = 0
simp [f'] All goals completed! 🐙C. The Spatial part
Extract spatial components from a Lorentz vector, returning them as a vector in Euclidean space.
abbrev spatialPart {d : ℕ} (v : Vector d) : EuclideanSpace ℝ (Fin d) :=
WithLp.toLp 2 fun i => v (Sum.inr i)lemma spatialPart_apply_eq_toCoord {d : ℕ} (v : Vector d) (i : Fin d) :
spatialPart v i = v (Sum.inr i) := rfl
lemma spatialPart_basis_sum_inr {d : ℕ} (i : Fin d) (j : Fin d) :
spatialPart (basis (Sum.inr i)) j =
(Finsupp.single (Sum.inr i : Fin 1 ⊕ Fin d) 1) (Sum.inr j) := by d:ℕi:Fin dj:Fin d⊢ (basis (Sum.inr i)).spatialPart.ofLp j = (Finsupp.single (Sum.inr i) 1) (Sum.inr j)
simp [basis_apply] d:ℕi:Fin dj:Fin d⊢ (if i = j then 1 else 0) = (Finsupp.single (Sum.inr i) 1) (Sum.inr j)
rw [Finsupp.single_apply d:ℕi:Fin dj:Fin d⊢ (if i = j then 1 else 0) = if Sum.inr i = Sum.inr j then 1 else 0 d:ℕi:Fin dj:Fin d⊢ (if i = j then 1 else 0) = if Sum.inr i = Sum.inr j then 1 else 0] d:ℕi:Fin dj:Fin d⊢ (if i = j then 1 else 0) = if Sum.inr i = Sum.inr j then 1 else 0
simp All goals completed! 🐙lemma spatialPart_basis_sum_inl {d : ℕ} (i : Fin d) :
spatialPart (basis (Sum.inl 0)) i = 0 := by d:ℕi:Fin d⊢ (basis (Sum.inl 0)).spatialPart.ofLp i = 0 simp All goals completed! 🐙The spatial part of a Lorentz vector as a continuous linear map.
def spatialCLM (d : ℕ) : Vector d →L[ℝ] EuclideanSpace ℝ (Fin d) where
toFun v := WithLp.toLp 2 fun i => v (Sum.inr i)
map_add' v1 v2 := by d:ℕv1:Vector dv2:Vector d⊢ (WithLp.toLp 2 fun i => (v1 + v2) (Sum.inr i)) =
(WithLp.toLp 2 fun i => v1 (Sum.inr i)) + WithLp.toLp 2 fun i => v2 (Sum.inr i) rfl All goals completed! 🐙
map_smul' c v := by d:ℕc:ℝv:Vector d⊢ (WithLp.toLp 2 fun i => (c • v) (Sum.inr i)) = (RingHom.id ℝ) c • WithLp.toLp 2 fun i => v (Sum.inr i) rfl All goals completed! 🐙
cont := by d:ℕ⊢ Continuous fun v => WithLp.toLp 2 fun i => v (Sum.inr i) fun_prop All goals completed! 🐙lemma spatialCLM_apply_eq_spatialPart {d : ℕ} (v : Vector d) (i : Fin d) :
spatialCLM d v i = spatialPart v i := rfl@[simp]
lemma spatialCLM_basis_sum_inl {d : ℕ} :
spatialCLM d (basis (Sum.inl 0)) = 0 := by d:ℕ⊢ (spatialCLM d) (basis (Sum.inl 0)) = 0
ext i d:ℕi:Fin d⊢ ((spatialCLM d) (basis (Sum.inl 0))).ofLp i = WithLp.ofLp 0 i
exact spatialPart_basis_sum_inl i All goals completed! 🐙
@[simp]
lemma spatialCLM_basis_sum_inr {d : ℕ} (i : Fin d) :
spatialCLM d (basis (Sum.inr i)) = EuclideanSpace.basisFun (Fin d) ℝ i := by d:ℕi:Fin d⊢ (spatialCLM d) (basis (Sum.inr i)) = (EuclideanSpace.basisFun (Fin d) ℝ) i
ext j d:ℕi:Fin dj:Fin d⊢ ((spatialCLM d) (basis (Sum.inr i))).ofLp j = ((EuclideanSpace.basisFun (Fin d) ℝ) i).ofLp j
rw [spatialCLM_apply_eq_spatialPart, d:ℕi:Fin dj:Fin d⊢ (basis (Sum.inr i)).spatialPart.ofLp j = ((EuclideanSpace.basisFun (Fin d) ℝ) i).ofLp j d:ℕi:Fin dj:Fin d⊢ (Finsupp.single (Sum.inr i) 1) (Sum.inr j) = ((EuclideanSpace.basisFun (Fin d) ℝ) i).ofLp j spatialPart_basis_sum_inr i j d:ℕi:Fin dj:Fin d⊢ (Finsupp.single (Sum.inr i) 1) (Sum.inr j) = ((EuclideanSpace.basisFun (Fin d) ℝ) i).ofLp j d:ℕi:Fin dj:Fin d⊢ (Finsupp.single (Sum.inr i) 1) (Sum.inr j) = ((EuclideanSpace.basisFun (Fin d) ℝ) i).ofLp j] d:ℕi:Fin dj:Fin d⊢ (Finsupp.single (Sum.inr i) 1) (Sum.inr j) = ((EuclideanSpace.basisFun (Fin d) ℝ) i).ofLp j
simp [Finsupp.single_apply] d:ℕi:Fin dj:Fin d⊢ (if i = j then 1 else 0) = if j = i then 1 else 0
congr 1 e_c d:ℕi:Fin dj:Fin d⊢ (i = j) = (j = i)
exact Eq.propIntro (fun a => id (Eq.symm a)) fun a => id (Eq.symm a) All goals completed! 🐙The Temporal component
Extract time component from a Lorentz vector
abbrev timeComponent {d : ℕ} (v : Vector d) : ℝ :=
v (Sum.inl 0)lemma timeComponent_basis_sum_inr {d : ℕ} (i : Fin d) :
timeComponent (basis (Sum.inr i)) = 0 := by d:ℕi:Fin d⊢ (basis (Sum.inr i)).timeComponent = 0 simp All goals completed! 🐙lemma timeComponent_basis_sum_inl {d : ℕ} :
timeComponent (d := d) (basis (Sum.inl 0)) = 1 := by d:ℕ⊢ (basis (Sum.inl 0)).timeComponent = 1 simp All goals completed! 🐙The temporal part of a Lorentz vector as a continuous linear map.
def temporalCLM (d : ℕ) : Vector d →L[ℝ] ℝ :=
LinearMap.toContinuousLinearMap {
toFun := fun v => v (Sum.inl 0)
map_add' := by d:ℕ⊢ ∀ (x y : Vector d), (x + y) (Sum.inl 0) = x (Sum.inl 0) + y (Sum.inl 0) simp All goals completed! 🐙
map_smul' := by d:ℕ⊢ ∀ (m : ℝ) (x : Vector d), (m • x) (Sum.inl 0) = (RingHom.id ℝ) m • x (Sum.inl 0) simp All goals completed! 🐙}lemma temporalCLM_apply_eq_timeComponent {d : ℕ} (v : Vector d) :
temporalCLM d v = timeComponent v := rfl@[simp]
lemma temporalCLM_basis_sum_inr {d : ℕ} (i : Fin d) :
temporalCLM d (basis (Sum.inr i)) = 0 := by d:ℕi:Fin d⊢ (temporalCLM d) (basis (Sum.inr i)) = 0
simp [temporalCLM_apply_eq_timeComponent, basis_apply] All goals completed! 🐙@[simp]
lemma temporalCLM_basis_sum_inl {d : ℕ} :
temporalCLM d (basis (Sum.inl 0)) = 1 := by d:ℕ⊢ (temporalCLM d) (basis (Sum.inl 0)) = 1
simp [temporalCLM_apply_eq_timeComponent, basis_apply] All goals completed! 🐙The continuous linear map corresponding to the creation of a Lorentz Vector with only a non-zero temporal component.
def ofTemporalComponent {d : ℕ} : ℝ →L[ℝ] Vector d where
toFun xt := xt • basis (Sum.inl 0)
map_add' := by d:ℕ⊢ ∀ (x y : ℝ), (x + y) • basis (Sum.inl 0) = x • basis (Sum.inl 0) + y • basis (Sum.inl 0) simp [add_smul] All goals completed! 🐙
map_smul' := by d:ℕ⊢ ∀ (m x : ℝ), (m • x) • basis (Sum.inl 0) = (RingHom.id ℝ) m • x • basis (Sum.inl 0) simp [smul_smul] All goals completed! 🐙The continuous linear map corresponding to the creation of a Lorentz Vector with only non-zero spatial components.
def ofSpatialComponent {d : ℕ} : EuclideanSpace ℝ (Fin d) →L[ℝ] Vector d where
toFun xs := ∑ i, xs i • basis (Sum.inr i)
map_add' xs ys := by d:ℕxs:EuclideanSpace ℝ (Fin d)ys:EuclideanSpace ℝ (Fin d)⊢ ∑ i, (xs + ys).ofLp i • basis (Sum.inr i) = ∑ i, xs.ofLp i • basis (Sum.inr i) + ∑ i, ys.ofLp i • basis (Sum.inr i)
simp [add_smul, Finset.sum_add_distrib] All goals completed! 🐙
map_smul' c xs := by d:ℕc:ℝxs:EuclideanSpace ℝ (Fin d)⊢ ∑ i, (c • xs).ofLp i • basis (Sum.inr i) = (RingHom.id ℝ) c • ∑ i, xs.ofLp i • basis (Sum.inr i)
simp [smul_smul, Finset.smul_sum] All goals completed! 🐙## Smoothness
Properties of the inner product (note not the Minkowski product)
lemma basis_inner {d : ℕ} (μ : Fin 1 ⊕ Fin d) (p : Lorentz.Vector d) :
⟪Lorentz.Vector.basis μ, p⟫_ℝ = p μ := by d:ℕμ:Fin 1 ⊕ Fin dp:Vector d⊢ ⟪basis μ, p⟫_ℝ = p μ
simp [inner_eq_equivEuclid] d:ℕμ:Fin 1 ⊕ Fin dp:Vector d⊢ ⟪(equivEuclid d) (basis μ), (equivEuclid d) p⟫_ℝ = p μ
rw [PiLp.inner_apply d:ℕμ:Fin 1 ⊕ Fin dp:Vector d⊢ ∑ i, ⟪((equivEuclid d) (basis μ)).ofLp i, ((equivEuclid d) p).ofLp i⟫_ℝ = p μ d:ℕμ:Fin 1 ⊕ Fin dp:Vector d⊢ ∑ i, ⟪((equivEuclid d) (basis μ)).ofLp i, ((equivEuclid d) p).ofLp i⟫_ℝ = p μ] d:ℕμ:Fin 1 ⊕ Fin dp:Vector d⊢ ∑ i, ⟪((equivEuclid d) (basis μ)).ofLp i, ((equivEuclid d) p).ofLp i⟫_ℝ = p μ
simp All goals completed! 🐙
lemma inner_basis {d : ℕ} (p : Lorentz.Vector d) (μ : Fin 1 ⊕ Fin d) :
⟪p, Lorentz.Vector.basis μ⟫_ℝ = p μ := by d:ℕp:Vector dμ:Fin 1 ⊕ Fin d⊢ ⟪p, basis μ⟫_ℝ = p μ
simp [inner_eq_equivEuclid] d:ℕp:Vector dμ:Fin 1 ⊕ Fin d⊢ ⟪(equivEuclid d) p, (equivEuclid d) (basis μ)⟫_ℝ = p μ
rw [PiLp.inner_apply d:ℕp:Vector dμ:Fin 1 ⊕ Fin d⊢ ∑ i, ⟪((equivEuclid d) p).ofLp i, ((equivEuclid d) (basis μ)).ofLp i⟫_ℝ = p μ d:ℕp:Vector dμ:Fin 1 ⊕ Fin d⊢ ∑ i, ⟪((equivEuclid d) p).ofLp i, ((equivEuclid d) (basis μ)).ofLp i⟫_ℝ = p μ] d:ℕp:Vector dμ:Fin 1 ⊕ Fin d⊢ ∑ i, ⟪((equivEuclid d) p).ofLp i, ((equivEuclid d) (basis μ)).ofLp i⟫_ℝ = p μ
simp All goals completed! 🐙