From 8b2c853fd83b3a044c157ad02e961449d371dd67 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 31 Jul 2024 07:29:59 -0400 Subject: [PATCH 1/2] feat: equivariance of rising and lowering indices --- .../SpaceTime/LorentzTensor/Contraction.lean | 4 +- .../LorentzTensor/MulActionTensor.lean | 66 +++++++++++++++---- .../LorentzTensor/RisingLowering.lean | 62 ++++++++++++++++- 3 files changed, 115 insertions(+), 17 deletions(-) diff --git a/HepLean/SpaceTime/LorentzTensor/Contraction.lean b/HepLean/SpaceTime/LorentzTensor/Contraction.lean index fed8eab..e08da05 100644 --- a/HepLean/SpaceTime/LorentzTensor/Contraction.lean +++ b/HepLean/SpaceTime/LorentzTensor/Contraction.lean @@ -287,9 +287,9 @@ lemma contrAll_rep {c : X → š“£.Color} {d : Y → š“£.Color} (e : X ā‰ƒ Y) ( simp only [mk_apply] apply congrArg funext x - rw [← repColorModule_colorModuleCast_apply] + rw [← colorModuleCast_equivariant_apply] nth_rewrite 2 [← contrDual_inv (c x) g] - rfl + simp @[simp] lemma contrAll_rep_apply {c : X → š“£.Color} {d : Y → š“£.Color} (e : X ā‰ƒ Y) (h : c = š“£.Ļ„ ∘ d ∘ e) diff --git a/HepLean/SpaceTime/LorentzTensor/MulActionTensor.lean b/HepLean/SpaceTime/LorentzTensor/MulActionTensor.lean index 46e9f14..c5de9da 100644 --- a/HepLean/SpaceTime/LorentzTensor/MulActionTensor.lean +++ b/HepLean/SpaceTime/LorentzTensor/MulActionTensor.lean @@ -27,6 +27,9 @@ class MulActionTensor (G : Type) [Monoid G] (š“£ : TensorStructure R) where /-- The contraction of a vector with its dual is invariant under the group action. -/ contrDual_inv : āˆ€ μ g, š“£.contrDual μ āˆ˜ā‚— TensorProduct.map (repColorModule μ g) (repColorModule (š“£.Ļ„ μ) g) = š“£.contrDual μ + /-- The invariance of the metric under the group action. -/ + metric_inv : āˆ€ μ g, (TensorProduct.map (repColorModule μ g) (repColorModule μ g)) (š“£.metric μ) = + š“£.metric μ namespace MulActionTensor @@ -50,6 +53,9 @@ def compHom (f : H →* G) : MulActionTensor H š“£ where contrDual_inv μ h := by simp only [MonoidHom.coe_comp, Function.comp_apply] rw [contrDual_inv] + metric_inv μ h := by + simp only [MonoidHom.coe_comp, Function.comp_apply] + rw [metric_inv] /-- The trivial `MulActionTensor` defined via trivial representations. -/ def trivial : MulActionTensor G š“£ where @@ -57,6 +63,9 @@ def trivial : MulActionTensor G š“£ where contrDual_inv μ g := by simp only [Representation.trivial, MonoidHom.one_apply, TensorProduct.map_one] rfl + metric_inv μ g := by + simp only [Representation.trivial, MonoidHom.one_apply, TensorProduct.map_one] + rfl end MulActionTensor @@ -74,6 +83,40 @@ variable {d : ā„•} {X Y Y' Z : Type} [Fintype X] [DecidableEq X] [Fintype Y] [De /-! +# Equivariance properties involving modules + +-/ + +@[simp] +lemma contrDual_equivariant_tmul (g : G) (x : š“£.ColorModule μ) (y : š“£.ColorModule (š“£.Ļ„ μ)) : + (š“£.contrDual μ ((repColorModule μ g x) āŠ—ā‚œ[R] (repColorModule (š“£.Ļ„ μ) g y))) = + š“£.contrDual μ (x āŠ—ā‚œ[R] y) := by + trans (š“£.contrDual μ āˆ˜ā‚— + TensorProduct.map (repColorModule μ g) (repColorModule (š“£.Ļ„ μ) g)) (x āŠ—ā‚œ[R] y) + rfl + rw [contrDual_inv] + +@[simp] +lemma colorModuleCast_equivariant_apply (h : μ = ν) (g : G) (x : š“£.ColorModule μ) : + (š“£.colorModuleCast h) (repColorModule μ g x) = + (repColorModule ν g) (š“£.colorModuleCast h x) := by + subst h + simp [colorModuleCast] + +@[simp] +lemma contrRightAux_contrDual_equivariant_tmul (g : G) (m : š“£.ColorModule ν āŠ—[R] š“£.ColorModule μ) + (x : š“£.ColorModule (š“£.Ļ„ μ)) : (contrRightAux (š“£.contrDual μ)) + ((TensorProduct.map (repColorModule ν g) (repColorModule μ g) m) āŠ—ā‚œ[R] + (repColorModule (š“£.Ļ„ μ) g x)) = + repColorModule ν g ((contrRightAux (š“£.contrDual μ)) (m āŠ—ā‚œ[R] x)) := by + refine TensorProduct.induction_on m (by simp) ?_ ?_ + Ā· intro y z + simp [contrRightAux] + Ā· intro x z h1 h2 + simp [add_tmul, LinearMap.map_add, h1, h2] + +/-! + ## Representation of tensor products -/ @@ -89,19 +132,13 @@ def rep : Representation R G (š“£.Tensor cX) where local infixl:101 " • " => š“£.rep -lemma repColorModule_colorModuleCast_apply (h : μ = ν) (g : G) (x : š“£.ColorModule μ) : - (repColorModule ν g) (š“£.colorModuleCast h x) = - (š“£.colorModuleCast h) (repColorModule μ g x) := by - subst h - simp [colorModuleCast] - @[simp] lemma repColorModule_colorModuleCast (h : μ = ν) (g : G) : (repColorModule ν g) āˆ˜ā‚— (š“£.colorModuleCast h).toLinearMap = (š“£.colorModuleCast h).toLinearMap āˆ˜ā‚— (repColorModule μ g) := by apply LinearMap.ext intro x - simp [repColorModule_colorModuleCast_apply] + simp [colorModuleCast_equivariant_apply] @[simp] lemma rep_mapIso (e : X ā‰ƒ Y) (h : cX = cY ∘ e) (g : G) : @@ -112,7 +149,7 @@ lemma rep_mapIso (e : X ā‰ƒ Y) (h : cX = cY ∘ e) (g : G) : simp only [LinearMap.compMultilinearMap_apply, LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply] erw [mapIso_tprod] - simp [rep, repColorModule_colorModuleCast_apply] + simp [rep, colorModuleCast_equivariant_apply] change (PiTensorProduct.map fun x => (repColorModule (cY x)) g) ((PiTensorProduct.tprod R) fun i => (š“£.colorModuleCast _) (x (e.symm i))) = (š“£.mapIso e h) ((PiTensorProduct.map _) ((PiTensorProduct.tprod R) x)) @@ -120,7 +157,7 @@ lemma rep_mapIso (e : X ā‰ƒ Y) (h : cX = cY ∘ e) (g : G) : apply congrArg funext i subst h - simp [repColorModule_colorModuleCast_apply] + simp [colorModuleCast_equivariant_apply] @[simp] lemma rep_mapIso_apply (e : X ā‰ƒ Y) (h : cX = cY ∘ e) (g : G) (x : š“£.Tensor cX) : @@ -143,7 +180,7 @@ lemma rep_tprod (g : G) (f : (i : X) → š“£.ColorModule (cX i)) : -/ -lemma rep_tensoratorEquiv (g : G) : +lemma tensoratorEquiv_equivariant (g : G) : (š“£.tensoratorEquiv cX cY) āˆ˜ā‚— (TensorProduct.map (š“£.rep g) (š“£.rep g)) = š“£.rep g āˆ˜ā‚— (š“£.tensoratorEquiv cX cY).toLinearMap := by apply tensorProd_piTensorProd_ext @@ -156,18 +193,19 @@ lemma rep_tensoratorEquiv (g : G) : | Sum.inl x => rfl | Sum.inr x => rfl -lemma rep_tensoratorEquiv_apply (g : G) (x : š“£.Tensor cX āŠ—[R] š“£.Tensor cY) : +@[simp] +lemma tensoratorEquiv_equivariant_apply (g : G) (x : š“£.Tensor cX āŠ—[R] š“£.Tensor cY) : (š“£.tensoratorEquiv cX cY) ((TensorProduct.map (š“£.rep g) (š“£.rep g)) x) = (š“£.rep g) ((š“£.tensoratorEquiv cX cY) x) := by trans ((š“£.tensoratorEquiv cX cY) āˆ˜ā‚— (TensorProduct.map (š“£.rep g) (š“£.rep g))) x rfl - rw [rep_tensoratorEquiv] + rw [tensoratorEquiv_equivariant] rfl lemma rep_tensoratorEquiv_tmul (g : G) (x : š“£.Tensor cX) (y : š“£.Tensor cY) : (š“£.tensoratorEquiv cX cY) ((g • x) āŠ—ā‚œ[R] (g • y)) = g • ((š“£.tensoratorEquiv cX cY) (x āŠ—ā‚œ[R] y)) := by - nth_rewrite 1 [← rep_tensoratorEquiv_apply] + nth_rewrite 1 [← tensoratorEquiv_equivariant_apply] rfl lemma rep_tensoratorEquiv_symm (g : G) : @@ -175,7 +213,7 @@ lemma rep_tensoratorEquiv_symm (g : G) : (š“£.tensoratorEquiv cX cY).symm.toLinearMap := by rw [LinearEquiv.eq_comp_toLinearMap_symm, LinearMap.comp_assoc, LinearEquiv.toLinearMap_symm_comp_eq] - exact Eq.symm (rep_tensoratorEquiv š“£ g) + exact Eq.symm (tensoratorEquiv_equivariant š“£ g) @[simp] lemma rep_tensoratorEquiv_symm_apply (g : G) (x : š“£.Tensor (Sum.elim cX cY)) : diff --git a/HepLean/SpaceTime/LorentzTensor/RisingLowering.lean b/HepLean/SpaceTime/LorentzTensor/RisingLowering.lean index 450b099..ed869d9 100644 --- a/HepLean/SpaceTime/LorentzTensor/RisingLowering.lean +++ b/HepLean/SpaceTime/LorentzTensor/RisingLowering.lean @@ -3,7 +3,7 @@ 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 -/ -import HepLean.SpaceTime.LorentzTensor.Basic +import HepLean.SpaceTime.LorentzTensor.MulActionTensor /-! # Rising and Lowering of indices @@ -31,6 +31,9 @@ variable {d : ā„•} {X Y Y' Z W C P : Type} [Fintype X] [DecidableEq X] [Fintype {cX cX2 : X → š“£.Color} {cY : Y → š“£.Color} {cZ : Z → š“£.Color} {cW : W → š“£.Color} {cY' : Y' → š“£.Color} {μ ν: š“£.Color} +variable {G H : Type} [Group G] [Group H] [MulActionTensor G š“£] +local infixl:101 " • " => š“£.rep + /-! ## Properties of the unit @@ -120,6 +123,27 @@ def dualizeModule (μ : š“£.Color) : š“£.ColorModule μ ā‰ƒā‚—[R] š“£.ColorMo Function.comp_apply, lTensorHomToHomLTensor_apply, LinearMap.id_coe, id_eq, metric_contrRight_unit] +@[simp] +lemma dualizeModule_equivariant (g : G) : + (š“£.dualizeModule μ) āˆ˜ā‚— ((MulActionTensor.repColorModule μ) g) = + (MulActionTensor.repColorModule (š“£.Ļ„ μ) g) āˆ˜ā‚— (š“£.dualizeModule μ) := by + apply LinearMap.ext + intro x + simp only [dualizeModule, dualizeFun, dualizeSymm, LinearEquiv.ofLinear_toLinearMap, + LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, colorModuleCast_equivariant_apply, + lTensorHomToHomLTensor_apply, LinearMap.id_coe, id_eq] + nth_rewrite 1 [← MulActionTensor.metric_inv (š“£.Ļ„ μ) g] + simp + +@[simp] +lemma dualizeModule_equivariant_apply (g : G) (x : š“£.ColorModule μ) : + (š“£.dualizeModule μ) ((MulActionTensor.repColorModule μ) g x) = + (MulActionTensor.repColorModule (š“£.Ļ„ μ) g) (š“£.dualizeModule μ x) := by + trans ((š“£.dualizeModule μ) āˆ˜ā‚— ((MulActionTensor.repColorModule μ) g)) x + rfl + rw [dualizeModule_equivariant] + rfl + /-- Dualizes the color of all indicies of a tensor by contraction with the metric. -/ def dualizeAll : š“£.Tensor cX ā‰ƒā‚—[R] š“£.Tensor (š“£.Ļ„ ∘ cX) := by refine LinearEquiv.ofLinear @@ -141,6 +165,24 @@ def dualizeAll : š“£.Tensor cX ā‰ƒā‚—[R] š“£.Tensor (š“£.Ļ„ ∘ cX) := by apply congrArg simp +@[simp] +lemma dualizeAll_equivariant (g : G) : (š“£.dualizeAll.toLinearMap) āˆ˜ā‚— (@rep R _ G _ š“£ _ X cX g) + = š“£.rep g āˆ˜ā‚— (š“£.dualizeAll.toLinearMap) := by + apply LinearMap.ext + intro x + simp [dualizeAll] + refine PiTensorProduct.induction_on' x ?_ (by + intro a b hx a + simp [map_add, add_tmul, hx] + simp_all only [Function.comp_apply, LinearMap.coe_comp, LinearMap.id_coe, id_eq]) + intro rx fx + simp + apply congrArg + change (PiTensorProduct.map _) ((PiTensorProduct.tprod R) _) = + (š“£.rep g) ((PiTensorProduct.map _) ((PiTensorProduct.tprod R) fx)) + rw [PiTensorProduct.map_tprod, PiTensorProduct.map_tprod] + simp + lemma dualize_cond (e : C āŠ• P ā‰ƒ X) : cX = Sum.elim (cX ∘ e ∘ Sum.inl) (cX ∘ e ∘ Sum.inr) ∘ e.symm := by rw [Equiv.eq_comp_symm] @@ -169,6 +211,24 @@ def dualize (e : C āŠ• P ā‰ƒ X) : š“£.Tensor cX ā‰ƒā‚—[R] (š“£.tensoratorEquiv _ _) ≪≫ₗ š“£.mapIso e (š“£.dualize_cond' e) +/-- Dualizing indices is equivariant with respect to the group action. This is the + applied version of this statement. -/ +@[simp] +lemma dualize_equivariant_apply (e : C āŠ• P ā‰ƒ X) (g : G) (x : š“£.Tensor cX) : + š“£.dualize e (g • x) = g • (š“£.dualize e x) := by + simp only [dualize, TensorProduct.congr, LinearEquiv.refl_toLinearMap, LinearEquiv.refl_symm, + LinearEquiv.trans_apply, rep_mapIso_apply, rep_tensoratorEquiv_symm_apply, + LinearEquiv.ofLinear_apply] + rw [← LinearMap.comp_apply (TensorProduct.map _ _), ← TensorProduct.map_comp] + simp only [dualizeAll_equivariant, LinearMap.id_comp] + have h1 {M N A B C : Type} [AddCommMonoid M] [AddCommMonoid N] [AddCommMonoid A] + [AddCommMonoid B] [AddCommMonoid C] [Module R M] [Module R N] [Module R A] [Module R B] + [Module R C] (f : M →ₗ[R] N) (g : A →ₗ[R] B) (h : B →ₗ[R] C) : TensorProduct.map (h āˆ˜ā‚— g) f + = TensorProduct.map h f āˆ˜ā‚— TensorProduct.map g (LinearMap.id) := + ext rfl + rw [h1, LinearMap.coe_comp, Function.comp_apply] + simp only [tensoratorEquiv_equivariant_apply, rep_mapIso_apply] + end TensorStructure end From 7b0b979d51cceb4c96a445d2f78e43d69d510b60 Mon Sep 17 00:00:00 2001 From: jstoobysmith <72603918+jstoobysmith@users.noreply.github.com> Date: Wed, 31 Jul 2024 08:52:09 -0400 Subject: [PATCH 2/2] feat: Add metric invariance for Real Lorentz Tensors --- HepLean/SpaceTime/LorentzGroup/Basic.lean | 21 +++ .../SpaceTime/LorentzTensor/Real/Basic.lean | 13 +- .../LorentzTensor/RisingLowering.lean | 2 +- .../SpaceTime/LorentzVector/Contraction.lean | 139 +++++++++++++++--- .../SpaceTime/LorentzVector/Covariant.lean | 10 ++ .../LorentzVector/LorentzAction.lean | 8 + HepLean/SpaceTime/MinkowskiMetric.lean | 6 + 7 files changed, 175 insertions(+), 24 deletions(-) diff --git a/HepLean/SpaceTime/LorentzGroup/Basic.lean b/HepLean/SpaceTime/LorentzGroup/Basic.lean index 98a12f5..5adf6fb 100644 --- a/HepLean/SpaceTime/LorentzGroup/Basic.lean +++ b/HepLean/SpaceTime/LorentzGroup/Basic.lean @@ -167,6 +167,27 @@ lemma subtype_mul_inv : (Subtype.val Ī›) * (Subtype.val Ī›)⁻¹ = 1 := by rw [mul_inv_self Ī›] simp only [lorentzGroupIsGroup_one_coe] +@[simp] +lemma mul_minkowskiMatrix_mul_transpose : + (Subtype.val Ī›) * minkowskiMatrix * (Subtype.val Ī›).transpose = minkowskiMatrix := by + have h2 := Ī›.prop + rw [LorentzGroup.mem_iff_self_mul_dual] at h2 + simp [minkowskiMetric.dual] at h2 + symm + refine right_inv_eq_left_inv minkowskiMatrix.sq ?_ + rw [← h2] + noncomm_ring + +@[simp] +lemma transpose_mul_minkowskiMatrix_mul_self : + (Subtype.val Ī›).transpose * minkowskiMatrix * (Subtype.val Ī›) = minkowskiMatrix := by + have h2 := Ī›.prop + rw [LorentzGroup.mem_iff_dual_mul_self] at h2 + simp [minkowskiMetric.dual] at h2 + refine right_inv_eq_left_inv ?_ minkowskiMatrix.sq + rw [← h2] + noncomm_ring + /-- 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⟩ diff --git a/HepLean/SpaceTime/LorentzTensor/Real/Basic.lean b/HepLean/SpaceTime/LorentzTensor/Real/Basic.lean index 745565e..dbf3abb 100644 --- a/HepLean/SpaceTime/LorentzTensor/Real/Basic.lean +++ b/HepLean/SpaceTime/LorentzTensor/Real/Basic.lean @@ -81,12 +81,12 @@ def realLorentzTensor (d : ā„•) : TensorStructure ā„ where | .down => LorentzVector.unitDown_rid metric μ := match μ with - | realTensor.ColorType.up => asProdLorentzVector - | realTensor.ColorType.down => asProdCovariantLorentzVector + | realTensor.ColorType.up => asTenProd + | realTensor.ColorType.down => asCoTenProd metric_dual μ := match μ with - | realTensor.ColorType.up => asProdLorentzVector_contr_asCovariantProdLorentzVector - | realTensor.ColorType.down => asProdCovariantLorentzVector_contr_asProdLorentzVector + | realTensor.ColorType.up => asTenProd_contr_asCoTenProd + | realTensor.ColorType.down => asCoTenProd_contr_asTenProd /-- The action of the Lorentz group on real Lorentz tensors. -/ instance : MulActionTensor (LorentzGroup d) (realLorentzTensor d) where @@ -98,5 +98,8 @@ instance : MulActionTensor (LorentzGroup d) (realLorentzTensor d) where match μ with | .up => TensorProduct.ext' (fun _ _ => LorentzVector.contrUpDown_invariant_lorentzAction) | .down => TensorProduct.ext' (fun _ _ => LorentzVector.contrDownUp_invariant_lorentzAction) - + metric_inv μ g := + match μ with + | .up => asTenProd_invariant g + | .down => asCoTenProd_invariant g end diff --git a/HepLean/SpaceTime/LorentzTensor/RisingLowering.lean b/HepLean/SpaceTime/LorentzTensor/RisingLowering.lean index ed869d9..7a95683 100644 --- a/HepLean/SpaceTime/LorentzTensor/RisingLowering.lean +++ b/HepLean/SpaceTime/LorentzTensor/RisingLowering.lean @@ -176,7 +176,7 @@ lemma dualizeAll_equivariant (g : G) : (š“£.dualizeAll.toLinearMap) āˆ˜ā‚— (@re simp [map_add, add_tmul, hx] simp_all only [Function.comp_apply, LinearMap.coe_comp, LinearMap.id_coe, id_eq]) intro rx fx - simp + simp only [PiTensorProduct.tprodCoeff_eq_smul_tprod, LinearMapClass.map_smul, rep_tprod] apply congrArg change (PiTensorProduct.map _) ((PiTensorProduct.tprod R) _) = (š“£.rep g) ((PiTensorProduct.map _) ((PiTensorProduct.tprod R) fx)) diff --git a/HepLean/SpaceTime/LorentzVector/Contraction.lean b/HepLean/SpaceTime/LorentzVector/Contraction.lean index 21c6e3a..25c3585 100644 --- a/HepLean/SpaceTime/LorentzVector/Contraction.lean +++ b/HepLean/SpaceTime/LorentzVector/Contraction.lean @@ -175,18 +175,41 @@ open scoped minkowskiMatrix variable {d : ā„•} /-- The metric tensor as an element of `LorentzVector d āŠ—[ā„] LorentzVector d`. -/ -def asProdLorentzVector : LorentzVector d āŠ—[ā„] LorentzVector d := - āˆ‘ μ, Ī· μ μ • (LorentzVector.stdBasis μ āŠ—ā‚œ[ā„] LorentzVector.stdBasis μ) +def asTenProd : LorentzVector d āŠ—[ā„] LorentzVector d := + āˆ‘ μ, āˆ‘ ν, Ī· μ ν • (LorentzVector.stdBasis μ āŠ—ā‚œ[ā„] LorentzVector.stdBasis ν) + +lemma asTenProd_diag : + @asTenProd d = āˆ‘ μ, Ī· μ μ • (LorentzVector.stdBasis μ āŠ—ā‚œ[ā„] LorentzVector.stdBasis μ) := by + simp only [asTenProd] + refine Finset.sum_congr rfl (fun μ _ => ?_) + rw [Finset.sum_eq_single μ] + intro ν _ hμν + rw [minkowskiMatrix.off_diag_zero hμν.symm] + simp only [zero_smul] + intro a + simp_all only /-- The metric tensor as an element of `CovariantLorentzVector d āŠ—[ā„] CovariantLorentzVector d`. -/ -def asProdCovariantLorentzVector : CovariantLorentzVector d āŠ—[ā„] CovariantLorentzVector d := - āˆ‘ μ, Ī· μ μ • (CovariantLorentzVector.stdBasis μ āŠ—ā‚œ[ā„] CovariantLorentzVector.stdBasis μ) +def asCoTenProd : CovariantLorentzVector d āŠ—[ā„] CovariantLorentzVector d := + āˆ‘ μ, āˆ‘ ν, Ī· μ ν • (CovariantLorentzVector.stdBasis μ āŠ—ā‚œ[ā„] CovariantLorentzVector.stdBasis ν) + +lemma asCoTenProd_diag : + @asCoTenProd d = āˆ‘ μ, Ī· μ μ • (CovariantLorentzVector.stdBasis μ āŠ—ā‚œ[ā„] + CovariantLorentzVector.stdBasis μ) := by + simp only [asCoTenProd] + refine Finset.sum_congr rfl (fun μ _ => ?_) + rw [Finset.sum_eq_single μ] + intro ν _ hμν + rw [minkowskiMatrix.off_diag_zero hμν.symm] + simp only [zero_smul] + intro a + simp_all only @[simp] -lemma contrLeft_asProdLorentzVector (x : CovariantLorentzVector d) : - contrLeftAux contrDownUp (x āŠ—ā‚œ[ā„] asProdLorentzVector) = +lemma contrLeft_asTenProd (x : CovariantLorentzVector d) : + contrLeftAux contrDownUp (x āŠ—ā‚œ[ā„] asTenProd) = āˆ‘ μ, ((Ī· μ μ * x μ) • LorentzVector.stdBasis μ) := by - simp only [asProdLorentzVector] + simp only [asTenProd_diag] rw [tmul_sum] rw [map_sum] refine Finset.sum_congr rfl (fun μ _ => ?_) @@ -196,10 +219,10 @@ lemma contrLeft_asProdLorentzVector (x : CovariantLorentzVector d) : exact smul_smul (Ī· μ μ) (x μ) (e μ) @[simp] -lemma contrLeft_asProdCovariantLorentzVector (x : LorentzVector d) : - contrLeftAux contrUpDown (x āŠ—ā‚œ[ā„] asProdCovariantLorentzVector) = +lemma contrLeft_asCoTenProd (x : LorentzVector d) : + contrLeftAux contrUpDown (x āŠ—ā‚œ[ā„] asCoTenProd) = āˆ‘ μ, ((Ī· μ μ * x μ) • CovariantLorentzVector.stdBasis μ) := by - simp only [asProdCovariantLorentzVector] + simp only [asCoTenProd_diag] rw [tmul_sum] rw [map_sum] refine Finset.sum_congr rfl (fun μ _ => ?_) @@ -209,17 +232,17 @@ lemma contrLeft_asProdCovariantLorentzVector (x : LorentzVector d) : exact smul_smul (Ī· μ μ) (x μ) (CovariantLorentzVector.stdBasis μ) @[simp] -lemma asProdLorentzVector_contr_asCovariantProdLorentzVector : - (contrMidAux (contrUpDown) (asProdLorentzVector āŠ—ā‚œ[ā„] asProdCovariantLorentzVector)) +lemma asTenProd_contr_asCoTenProd : + (contrMidAux (contrUpDown) (asTenProd āŠ—ā‚œ[ā„] asCoTenProd)) = TensorProduct.comm ā„ _ _ (@unitUp d) := by - simp only [contrMidAux, LinearEquiv.refl_toLinearMap, asProdLorentzVector, LinearMap.coe_comp, + simp only [contrMidAux, LinearEquiv.refl_toLinearMap, asTenProd_diag, LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply] rw [sum_tmul, map_sum, map_sum, unitUp] simp only [Finset.univ_unique, Fin.default_eq_zero, Fin.isValue, Finset.sum_singleton, map_add, comm_tmul, map_sum] refine Finset.sum_congr rfl (fun μ _ => ?_) rw [← tmul_smul, TensorProduct.assoc_tmul] - simp only [map_tmul, LinearMap.id_coe, id_eq, contrLeft_asProdCovariantLorentzVector] + simp only [map_tmul, LinearMap.id_coe, id_eq, contrLeft_asCoTenProd] rw [tmul_sum, Finset.sum_eq_single_of_mem μ, tmul_smul] change (Ī· μ μ * (Ī· μ μ * e μ μ)) • e μ āŠ—ā‚œ[ā„] CovariantLorentzVector.stdBasis μ = _ rw [LorentzVector.stdBasis] @@ -236,10 +259,10 @@ lemma asProdLorentzVector_contr_asCovariantProdLorentzVector : exact fun a => False.elim (hμν (id (Eq.symm a))) @[simp] -lemma asProdCovariantLorentzVector_contr_asProdLorentzVector : - (contrMidAux (contrDownUp) (asProdCovariantLorentzVector āŠ—ā‚œ[ā„] asProdLorentzVector)) +lemma asCoTenProd_contr_asTenProd : + (contrMidAux (contrDownUp) (asCoTenProd āŠ—ā‚œ[ā„] asTenProd)) = TensorProduct.comm ā„ _ _ (@unitDown d) := by - simp only [contrMidAux, LinearEquiv.refl_toLinearMap, asProdCovariantLorentzVector, + simp only [contrMidAux, LinearEquiv.refl_toLinearMap, asCoTenProd_diag, LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply] rw [sum_tmul, map_sum, map_sum, unitDown] simp only [Finset.univ_unique, Fin.default_eq_zero, Fin.isValue, @@ -247,7 +270,7 @@ lemma asProdCovariantLorentzVector_contr_asProdLorentzVector : refine Finset.sum_congr rfl (fun μ _ => ?_) rw [smul_tmul, TensorProduct.assoc_tmul] simp only [tmul_smul, LinearMapClass.map_smul, map_tmul, LinearMap.id_coe, id_eq, - contrLeft_asProdLorentzVector] + contrLeft_asTenProd] rw [tmul_sum, Finset.sum_eq_single_of_mem μ, tmul_smul, smul_smul, LorentzVector.stdBasis] erw [Pi.basisFun_apply] simp only [LinearMap.stdBasis_same, mul_one, Ī·_apply_mul_Ī·_apply_diag, one_smul] @@ -260,6 +283,86 @@ lemma asProdCovariantLorentzVector_contr_asProdLorentzVector : ite_eq_right_iff, smul_eq_zero, mul_eq_zero] exact fun a => False.elim (hμν (id (Eq.symm a))) +lemma asTenProd_invariant (g : LorentzGroup d) : + TensorProduct.map (LorentzVector.rep g) (LorentzVector.rep g) asTenProd = asTenProd := by + simp only [asTenProd, map_sum, LinearMapClass.map_smul, map_tmul, rep_apply_stdBasis, + Matrix.transpose_apply] + trans āˆ‘ μ : Fin 1 āŠ• Fin d, āˆ‘ ν : Fin 1 āŠ• Fin d, āˆ‘ φ : Fin 1 āŠ• Fin d, + Ī· μ ν • (g.1 φ μ • e φ) āŠ—ā‚œ[ā„] āˆ‘ ρ : Fin 1 āŠ• Fin d, g.1 ρ ν • e ρ + refine Finset.sum_congr rfl (fun μ _ => Finset.sum_congr rfl (fun ν _ => ?_)) + rw [sum_tmul, Finset.smul_sum] + trans āˆ‘ μ : Fin 1 āŠ• Fin d, āˆ‘ ν : Fin 1 āŠ• Fin d, āˆ‘ φ : Fin 1 āŠ• Fin d, āˆ‘ ρ : Fin 1 āŠ• Fin d, + (Ī· μ ν • (g.1 φ μ • e φ) āŠ—ā‚œ[ā„] (g.1 ρ ν • e ρ)) + Ā· refine Finset.sum_congr rfl (fun μ _ => Finset.sum_congr rfl (fun ν _ => + Finset.sum_congr rfl (fun φ _ => ?_))) + rw [tmul_sum, Finset.smul_sum] + rw [Finset.sum_congr rfl (fun μ _ => Finset.sum_comm)] + rw [Finset.sum_congr rfl (fun μ _ => Finset.sum_congr rfl (fun ν _ => Finset.sum_comm))] + rw [Finset.sum_comm] + rw [Finset.sum_congr rfl (fun φ _ => Finset.sum_comm)] + trans āˆ‘ φ : Fin 1 āŠ• Fin d, āˆ‘ ρ : Fin 1 āŠ• Fin d, āˆ‘ μ : Fin 1 āŠ• Fin d, āˆ‘ ν : Fin 1 āŠ• Fin d, + ((g.1 φ μ * Ī· μ ν * g.1 ρ ν) • (e φ) āŠ—ā‚œ[ā„] (e ρ)) + Ā· refine Finset.sum_congr rfl (fun φ _ => Finset.sum_congr rfl (fun ρ _ => + Finset.sum_congr rfl (fun μ _ => Finset.sum_congr rfl (fun ν _ => ?_)))) + rw [smul_tmul, tmul_smul, tmul_smul, smul_smul, smul_smul] + ring_nf + rw [Finset.sum_congr rfl (fun φ _ => Finset.sum_congr rfl (fun ρ _ => + Finset.sum_congr rfl (fun μ _ => Finset.sum_smul.symm)))] + rw [Finset.sum_congr rfl (fun φ _ => Finset.sum_congr rfl (fun ρ _ => Finset.sum_smul.symm))] + trans āˆ‘ φ : Fin 1 āŠ• Fin d, āˆ‘ ρ : Fin 1 āŠ• Fin d, + (((g.1 * minkowskiMatrix * g.1.transpose : Matrix _ _ _) φ ρ) • (e φ) āŠ—ā‚œ[ā„] (e ρ)) + Ā· refine Finset.sum_congr rfl (fun φ _ => Finset.sum_congr rfl (fun ρ _ => ?_)) + apply congrFun + apply congrArg + simp only [Matrix.mul_apply, Matrix.transpose_apply] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl (fun μ _ => ?_) + rw [Finset.sum_mul] + simp + +open CovariantLorentzVector in +lemma asCoTenProd_invariant (g : LorentzGroup d) : + TensorProduct.map (CovariantLorentzVector.rep g) (CovariantLorentzVector.rep g) + asCoTenProd = asCoTenProd := by + simp only [asCoTenProd, map_sum, LinearMapClass.map_smul, map_tmul, + CovariantLorentzVector.rep_apply_stdBasis, Matrix.transpose_apply] + trans āˆ‘ μ : Fin 1 āŠ• Fin d, āˆ‘ ν : Fin 1 āŠ• Fin d, āˆ‘ φ : Fin 1 āŠ• Fin d, + Ī· μ ν • (g⁻¹.1 μ φ • CovariantLorentzVector.stdBasis φ) āŠ—ā‚œ[ā„] + āˆ‘ ρ : Fin 1 āŠ• Fin d, g⁻¹.1 ν ρ • CovariantLorentzVector.stdBasis ρ + Ā· refine Finset.sum_congr rfl (fun μ _ => Finset.sum_congr rfl (fun ν _ => ?_)) + rw [sum_tmul, Finset.smul_sum] + trans āˆ‘ μ : Fin 1 āŠ• Fin d, āˆ‘ ν : Fin 1 āŠ• Fin d, āˆ‘ φ : Fin 1 āŠ• Fin d, āˆ‘ ρ : Fin 1 āŠ• Fin d, + (Ī· μ ν • (g⁻¹.1 μ φ • CovariantLorentzVector.stdBasis φ) āŠ—ā‚œ[ā„] + (g⁻¹.1 ν ρ • CovariantLorentzVector.stdBasis ρ)) + Ā· refine Finset.sum_congr rfl (fun μ _ => Finset.sum_congr rfl (fun ν _ => + Finset.sum_congr rfl (fun φ _ => ?_))) + rw [tmul_sum, Finset.smul_sum] + rw [Finset.sum_congr rfl (fun μ _ => Finset.sum_comm)] + rw [Finset.sum_congr rfl (fun μ _ => Finset.sum_congr rfl (fun ν _ => Finset.sum_comm))] + rw [Finset.sum_comm] + rw [Finset.sum_congr rfl (fun φ _ => Finset.sum_comm)] + trans āˆ‘ φ : Fin 1 āŠ• Fin d, āˆ‘ ρ : Fin 1 āŠ• Fin d, āˆ‘ μ : Fin 1 āŠ• Fin d, āˆ‘ ν : Fin 1 āŠ• Fin d, + ((g⁻¹.1 μ φ * Ī· μ ν * g⁻¹.1 ν ρ) • (CovariantLorentzVector.stdBasis φ) āŠ—ā‚œ[ā„] + (CovariantLorentzVector.stdBasis ρ)) + Ā· refine Finset.sum_congr rfl (fun φ _ => Finset.sum_congr rfl (fun ρ _ => + Finset.sum_congr rfl (fun μ _ => Finset.sum_congr rfl (fun ν _ => ?_)))) + rw [smul_tmul, tmul_smul, tmul_smul, smul_smul, smul_smul] + ring_nf + rw [Finset.sum_congr rfl (fun φ _ => Finset.sum_congr rfl (fun ρ _ => + Finset.sum_congr rfl (fun μ _ => Finset.sum_smul.symm)))] + rw [Finset.sum_congr rfl (fun φ _ => Finset.sum_congr rfl (fun ρ _ => Finset.sum_smul.symm))] + trans āˆ‘ φ : Fin 1 āŠ• Fin d, āˆ‘ ρ : Fin 1 āŠ• Fin d, + (((g⁻¹.1.transpose * minkowskiMatrix * g⁻¹.1 : Matrix _ _ _) φ ρ) • + (CovariantLorentzVector.stdBasis φ) āŠ—ā‚œ[ā„] (CovariantLorentzVector.stdBasis ρ)) + Ā· refine Finset.sum_congr rfl (fun φ _ => Finset.sum_congr rfl (fun ρ _ => ?_)) + apply congrFun + apply congrArg + simp only [Matrix.mul_apply, Matrix.transpose_apply] + rw [Finset.sum_comm] + refine Finset.sum_congr rfl (fun μ _ => ?_) + rw [Finset.sum_mul] + rw [LorentzGroup.transpose_mul_minkowskiMatrix_mul_self] + end minkowskiMatrix end diff --git a/HepLean/SpaceTime/LorentzVector/Covariant.lean b/HepLean/SpaceTime/LorentzVector/Covariant.lean index b2e799b..0deadf7 100644 --- a/HepLean/SpaceTime/LorentzVector/Covariant.lean +++ b/HepLean/SpaceTime/LorentzVector/Covariant.lean @@ -94,6 +94,16 @@ lemma rep_apply (g : LorentzGroup d) : rep g v = (g.1⁻¹)įµ€ *ᵄ v := by rw [← LorentzGroup.coe_inv] rfl +lemma rep_apply_stdBasis (g : LorentzGroup d) (μ : Fin 1 āŠ• Fin d) : + rep g (stdBasis μ) = āˆ‘ ν, g⁻¹.1 μ ν • stdBasis ν := by + simp only [rep_apply, Fintype.sum_sum_type, Finset.univ_unique, Fin.default_eq_zero, Fin.isValue, + Finset.sum_singleton, decomp_stdBasis'] + funext ν + simp [LorentzVector.stdBasis, Pi.basisFun_apply] + erw [Pi.basisFun_apply, Matrix.mulVec_stdBasis] + rw [← LorentzGroup.coe_inv] + simp + end CovariantLorentzVector end diff --git a/HepLean/SpaceTime/LorentzVector/LorentzAction.lean b/HepLean/SpaceTime/LorentzVector/LorentzAction.lean index 40ad4d1..4a58bfd 100644 --- a/HepLean/SpaceTime/LorentzVector/LorentzAction.lean +++ b/HepLean/SpaceTime/LorentzVector/LorentzAction.lean @@ -28,6 +28,14 @@ def rep : Representation ā„ (LorentzGroup d) (LorentzVector d) where open Matrix in lemma rep_apply (g : LorentzGroup d) : rep g v = g *ᵄ v := rfl +lemma rep_apply_stdBasis (g : LorentzGroup d) (μ : Fin 1 āŠ• Fin d) : + rep g (stdBasis μ) = āˆ‘ ν, g.1.transpose μ ν • stdBasis ν := by + simp only [rep_apply, Fintype.sum_sum_type, Finset.univ_unique, Fin.default_eq_zero, Fin.isValue, + Finset.sum_singleton, decomp_stdBasis'] + funext ν + simp [LorentzVector.stdBasis, Pi.basisFun_apply] + erw [Pi.basisFun_apply, Matrix.mulVec_stdBasis] + end LorentzVector end diff --git a/HepLean/SpaceTime/MinkowskiMetric.lean b/HepLean/SpaceTime/MinkowskiMetric.lean index 82da1fd..972b85f 100644 --- a/HepLean/SpaceTime/MinkowskiMetric.lean +++ b/HepLean/SpaceTime/MinkowskiMetric.lean @@ -79,6 +79,12 @@ lemma as_block : @minkowskiMatrix d = ( rw [← diagonal_neg] rfl +@[simp] +lemma off_diag_zero {μ ν : Fin 1 āŠ• Fin d} (h : μ ≠ ν) : Ī· μ ν = 0 := by + simp only [minkowskiMatrix, LieAlgebra.Orthogonal.indefiniteDiagonal] + apply diagonal_apply_ne + exact h + end minkowskiMatrix /-!